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.
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.
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.
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.
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.
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:
Agora iremos criar o Nosso Makefile para carregar os scripts:
Arquivo Makefile
# Script de criacao do banco de dados
# Autor Marcelo Maurin Martins
# Daa: 31/01/2022
#
APP=mysql
all: database Tabelas
database:
$(APP) < database.sql
Tabelas:
$(APP) < pessoas.sql
Em seguida iremos criar o script de criação da base de dados, database.sql:
#Cria um banco de dados em Mysql
#Autor: Marcelo Maurin Martins
#31/01/2022
create database IF NOT EXISTS `testedb`;
E por fim nossa tabela pessoas.sql
#Cria a tabela de pessoas
#Autor: Marcelo Maurin Martins
#31/01/2022
use testedb;
create table if not exists pessoas
(
idPessoa INT(6) unsigned auto_increment primary key,
nome varchar(30) not null,
dtnasc date,
profissao varchar(20),
sexo char(1),
dtchg timestamp default current_timestamp on update current_timestamp,
dtcad timestamp default current_timestamp
);
Executando Scripts
Entre na pasta scripts, para que possamos criar nossas estruturas de banco.
Digite o comando:
make
executa a criação do banco
A figura abaixo mostra sua execução
Exemplo do script do banco de dados
Por fim mais um vídeozinho
Procedimento de instalação dos scripts
Permissões
Ao montar o segundo artigo lembrei que para melhorar este artigo, o ideal seria criar uma conta especifica para cada aplicação. Desta forma criei um scripts novo chamado GRANTS.SQL
Desta forma, existe essa ultima etapa. Que precisamos, que será criar um usuário para acesso a aplicação:
Criando o usuario:
CREATE USER 'seu_usuario'@'localhost' IDENTIFIED BY 'suasenha';
Dando permissão:
GRANT ALL PRIVILEGES ON * . * TO 'seu_usuario'@'localhost';
Finalizando
FLUSH PRIVILEGES;
Este procedimento será validado, quando digitarmos
mysql -h localhost -u gcc -p
Conectando em banco de dados
Pois se as permissões não estiverem corretas o usuario não conecta.
Sempre que avançarmos em uma etapa, um novo usuário será criado, neste script.
Então não estranhem se eventualmente os scripts sofrerem modificação no git.
Cenas do próximos capítulos
Agora que preparamos a cama, iremos começar a codificar nela. No próximo artigo iremos criar um crud em C para cadastrar pessoas.
Neste artigo irei apresentar um exemplo de código de opencv em C++.
Irei comentar traçando referencias entre o código do C e o código do python.
O Exemplo utililizado será fornecido pela própria biblioteca em python.
Aqui vemos o exemplo comentado do fonte
OpenCV em Python
Para traçar um paralelo usaremos os códigos do opencv, o programa chamado video_v4l2.py
Conforme apresentado abaixo:
#!/usr/bin/env python
'''
VideoCapture sample showcasing some features of the Video4Linux2 backend
Sample shows how VideoCapture class can be used to control parameters
of a webcam such as focus or framerate.
Also the sample provides an example how to access raw images delivered
by the hardware to get a grayscale image in a very efficient fashion.
Keys:
ESC - exit
g - toggle optimized grayscale conversion
'''
# Python 2/3 compatibility
from __future__ import print_function
import numpy as np
import cv2 as cv
def main():
def decode_fourcc(v):
v = int(v)
return "".join([chr((v >> 8 * i) & 0xFF) for i in range(4)])
font = cv.FONT_HERSHEY_SIMPLEX
color = (0, 255, 0)
cap = cv.VideoCapture(0)
cap.set(cv.CAP_PROP_AUTOFOCUS, 0) # Known bug: https://github.com/opencv/opencv/pull/5474
cv.namedWindow("Video")
convert_rgb = True
fps = int(cap.get(cv.CAP_PROP_FPS))
focus = int(min(cap.get(cv.CAP_PROP_FOCUS) * 100, 2**31-1)) # ceil focus to C_LONG as Python3 int can go to +inf
cv.createTrackbar("FPS", "Video", fps, 30, lambda v: cap.set(cv.CAP_PROP_FPS, v))
cv.createTrackbar("Focus", "Video", focus, 100, lambda v: cap.set(cv.CAP_PROP_FOCUS, v / 100))
while True:
_status, img = cap.read()
fourcc = decode_fourcc(cap.get(cv.CAP_PROP_FOURCC))
fps = cap.get(cv.CAP_PROP_FPS)
if not bool(cap.get(cv.CAP_PROP_CONVERT_RGB)):
if fourcc == "MJPG":
img = cv.imdecode(img, cv.IMREAD_GRAYSCALE)
elif fourcc == "YUYV":
img = cv.cvtColor(img, cv.COLOR_YUV2GRAY_YUYV)
else:
print("unsupported format")
break
cv.putText(img, "Mode: {}".format(fourcc), (15, 40), font, 1.0, color)
cv.putText(img, "FPS: {}".format(fps), (15, 80), font, 1.0, color)
cv.imshow("Video", img)
k = cv.waitKey(1)
if k == 27:
break
elif k == ord('g'):
convert_rgb = not convert_rgb
cap.set(cv.CAP_PROP_CONVERT_RGB, 1 if convert_rgb else 0)
print('Done')
if __name__ == '__main__':
print(__doc__)
main()
cv.destroyAllWindows()
A primeira informação importante é a carga das bibliotecas do opencv em python.
import cv2 as cvimport cv2 as cv
carga da lib em python
O proximo ponto importante é onde capturamos o vídeo.
cap = cv.VideoCapture(0)
Captura do vídeo
O Parametro 0, indica que o device de vídeo é o padrão do sistema.
O ponto importante no código é o uso do cap, no código abaixo:
_status, img = cap.read()
captura do frame
Ao chamar a função read, dois parametros são retornados, _status (retorno de sucesso) e img, a imagem capturada.
Por fim, uma janela é montada com a visualização da imagem capturada:
cv.imshow(“Video”, img)
janela é montada
Agora iremos analisar o mesmo código em C.
OpenCV em C
Agora mostraremos o código em C, o exemplo é o videocapture_basic.cpp:
#include <opencv2/core.hpp>
#include <opencv2/videoio.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>
#include <stdio.h>
using namespace cv;
using namespace std;
int main(int, char**)
{
Mat frame;
//--- INITIALIZE VIDEOCAPTURE
VideoCapture cap;
// open the default camera using default API
// cap.open(0);
// OR advance usage: select any API backend
int deviceID = 0; // 0 = open default camera
int apiID = cv::CAP_ANY; // 0 = autodetect default API
// open selected camera using selected API
cap.open(deviceID, apiID);
// check if we succeeded
if (!cap.isOpened()) {
cerr << "ERROR! Unable to open camera\n";
return -1;
}
//--- GRAB AND WRITE LOOP
cout << "Start grabbing" << endl
<< "Press any key to terminate" << endl;
for (;;)
{
// wait for a new frame from camera and store it into 'frame'
cap.read(frame);
// check if we succeeded
if (frame.empty()) {
cerr << "ERROR! blank frame grabbed\n";
break;
}
// show live and wait for a key with timeout long enough to show images
imshow("Live", frame);
if (waitKey(5) >= 0)
break;
}
// the camera will be deinitialized automatically in VideoCapture destructor
return 0;
}
O primeiro ponto assim como no código em python, e a chamada da biblioteca em c.
Sem esses includes não teriamos acessos aos tipos do C, como o que segue:
VideoCapture cap;
O tipo VideoCapture é o tipo associado a captura de vídeo da câmera.
Onde usaremos, conforme fragmento abaixo:
int deviceID = 0; // 0 = open default camera
int apiID = cv::CAP_ANY; // 0 = autodetect default API
// open selected camera using selected API
cap.open(deviceID, apiID);
Aqui, definimos o deviceID como 0, ou seja, o valor padrão, veja a semelhança do uso do python.
E apiID, passando o escopo (variavel) CAP_ANY, que tem por valor 0.
Chamamos o método open da classe VideoCapture, indicando o deviceID, e o apiID.
Agora iremos ler a imagem da camera, que podemos fazer, através da seguinte função:
cap.read(frame);
Neste fragmento de código, passamos o parametro frame, que é do tipo Mat.
O frame receberá a imagem capturada.
E por fim, no código abaixo a janela que irá mostrar a imagem na interface gráfica.
imshow("Live", frame);
Conclusão
Apesar das diferenças de linguagem, podemos ver o pontos em comum, e a sutileza da semelhança.
É lógico que os códigos foram escolhidos a dedo. Justamente por conta da semelhança e simplicidade.
O opencv é uma biblioteca rica, cheia de opções e dificuldades, este tutorial, bem como o autor, esta apenas adentrando neste mundo para mim misterioso.