Blog Dicas
Moodle no Raspberry PI

Moodle é uma plataforma de e-learning que permite escrever e armazenar cursos online.

O moodle atualmente é a ferramenta online mais usada no mercado.

Estaremos aqui apresentando uma solução de pequeno custo, para que voce desenvolvedor, crie sua própria “escola” online com um pequeno custo.

Usaremos o Rasperry PI para instalar o Moodle.

Primeiramente, é necessário ter um raspberry pi, no caso usei o Raspberry Pi 3, que apesar de sua capacidade limitada, da conta da tarefa.

Baixar imagem no site

Usaremos para instalar o moodle o projeto moodlebox.net, que disponibiliza uma imagem de distribuição instalável no raspberry pi.

https://moodlebox.net/en/help/download-the-disk-image/

A maior parte das informações aqui dispostas, foram compiladas deste próprio site.

Baixe o aplicativo, e em seguida grave o cartão sd. Recomendo que o seu cartão tenha no mínimo 16gb, recomendável que seja maior, para que consiga usar uma base maior.

Para gravar a imagem eu utilizo o programa win32disk, que pode ser baixado em :

https://sourceforge.net/projects/win32diskimager/

gravação do moodle em sd

Após esta etapa, agora iremos instalar o cartão no raspberry, e liga-lo.

Instalação

Após a gravação do cartão, e ter ligado o raspberry pi.

MoodleBox network topology
topologia de instalação do Moodle

O moodle ira ser instalado em sua maquina. Aguarde alguns segundos, para a instalação ser completada.

Ao instalar o moodle irá criar uma rede wifi chamada moodle

A senha será moodlebox tudo minusculo.

Conecte-se a rede para finalizar.

Após conecectado entre no browser e conecte-se através do site:

http://moodlebox.home/

Tela do moodle

Percebi, que a tela demorou vários segundos para aparecer, no meu caso tive que desativar a conexão ethernet, e deixar apenas o wifi conectado.

CLick no link de login, para entrar o usuário e senha.

Autenticação

Por padrão o usuário e senha são:

  • Usuário: moodlebox
  • Senha: Moodlebox4$

Recomendamos que faça a mudança o mais brevemente possível destes.

Conectar por Ethernet

Para conectectar via ssh, é necessário descobrir primeiro o ip que o servidor DHCP, estabeleceu para sua maquina.

Para isso entre no seu roteador, verifique o ip sorteado para ele.

No meu caso foi esse, no seu pode mudar

Agora é necessário incluir no arquivo hosts de sua maquina o seguinte padrão.

No windows 10 o arquivo hosts fica em C:\Windows\System32\drivers\etc

E para edita-lo será necessário estar em modo administrador.

edição do arquivo hosts no windows 10

Pronto sua maquina agora encontrará o

http://moodlebox.home

Acesso SSH

Para conectar via SSH será necessário usar um cliente ssh, no meu caso uso o bitvise

conexão com bitvise

As informações de conexão são:

  • host: moodlebox
  • username: moodlebox
  • password: Moodlebox4$

Agora vc pode trabalhar diretamente no servidor

Acesso ssh no servidor Moodle.

Próximos passos

Em breve estarei adicionando novos postas, pois também sou aluno como você, e a medida que aprendo, publicarei novos posts.

Blog C/C++
C na WEB

Criar aplicações capazes de interagir com o mundo externo, através de solicitações web, é uma prática muito util.

Estaremos abordando aqui, como fazer isso.

Estaremos explicando agora a API LIB CURL.

Esta api é suportada pelo fabricante:

https://curl.se/

Baixando no Ubuntu

Para baixar no ubunto execute os seguintes comandos:

apt install libcurl4 libcurl4-gnutls-dev

Apos instalar rode os seguintes comandos:

sudo ln -s /usr/include/x86_64-linux-gnu/curl /usr/include/curl

sudo ln -s /usr/lib/x86_64-linux-gnu/libcurl.so.4 /usr/lib/libcurl.so.4

Estes links irão permitir incluir os includes nos locais corretos e o lib p sua perfeita compilação.

Rodando um exemplo

Crie uma pasta no seu linux chamado sample, nela realize as seguintes operações:

  1. Crie um arquivo Makefile, conforme o que segue:

all: compile

compile:
	gcc simple.c  -lcurl	-o simple

2. Agora crie um arquivo simple.c, conforme segue:

#include <stdio.h>
#include <curl/curl.h>

int main(void)
{
  CURL *curl;
  CURLcode res;

  curl = curl_easy_init();
  if(curl) {
    curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
    /* example.com is redirected, so we tell libcurl to follow redirection */
    curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);

    /* Perform the request, res will get the return code */
    res = curl_easy_perform(curl);
    /* Check for errors */
    if(res != CURLE_OK)
      fprintf(stderr, "curl_easy_perform() failed: %s\n",
              curl_easy_strerror(res));

    /* always cleanup */
    curl_easy_cleanup(curl);
  }
  return 0;
}

O exemplo acima é uma cópia do código apresentado na documentação.

O Repositório do projeto pode ser visto no link abaixo:

https://github.com/curl/curl/tree/master/docs/examples

Para compilar basta dar make, conforme o exemplo:

Segue o exemplo rodando:

Em breve detalharei sobre como funciona este exemplo.

Sem categoria
Criando aplicação debugavel no linux

Objetivo

Neste tutorial, apresentaremos o básico necessário para permitir a criação de uma aplicação, inclusive debugar quando necessário.

Gerando o binário

Neste tópico criarei um binário, que é um executável.

Para este exemplo, usarei o projeto do git:

https://github.com/MarceloMaurin/srvFalar

O projeto é um servidor de sintetização de voz, um maior detalhamento sobre este projeto pode ser visto no artigo abaixo:

http://maurinsoft.com.br/index.php/2021/06/15/servidor-de-fala/

Makefile

O Makefile é o construtor da aplicação. Com ele podemos gerar o binário, bem como realizar atividades de instalação e preparação, previas para sua construção.

Outra atividade de responsabilidade do Makefile, é a geração de versão de debug.

Abaixo o exemplo do Makefile do nosso projeto.

#HEADERS = program.h headers.h

MYESPEAK=-lespeak

default: all

all: clean compile install

compile:
	gcc  fala.c $(MYESPEAK) -Wall -o SRVFalar

install:
	cp  SRVFalar /usr/local/bin/

debug:
	gcc fala.c $(MYESPEAK) -g -Wall -o SRVFalar

clean:
	rm -f /usr/local/bin/SRVFalar
	rm -f ./SRVFalar

Nele exemplo podemos ver que existem 5 alvos de compilação:

  • all
  • compile
  • install
  • debug
  • clean

O alvo all, é o padrão, e quando não indicado um alvo de compilação no make, usa-se este por padrão.

make

make sem alvo, subentende-se o all

Podemos também usar o alvo debug, que é destinado a gerar os binários de debug.

make debug

gerando binario de debug

O compilador GCC, possui como parametro de debug o -g, que deve ser usado quando se deseja debugar uma aplicação.

gcc fala.c $(MYESPEAK) -g -Wall -o SRVFalar

A seguir, estarei apresentando um vídeo sintetizando cada passo descrito acima.

Debugar é

Debugar é entender o que esta acontecendo internamente em um projeto, analisando cada passo de um programa.

Analisando não só suas entradas e saídas, mas tambem os passos e atividades relacionados a sua execução.

Usando o DEBUG

Para utilizar o debug, usamos o comando:

gdb <progrma> [fonte]

sintaxe do gdb

No nosso caso podemos chamar o debug, através do exemplo abaixo:

gdb SRVFalar

Os comandos do debug podem ser vistos, através de outro artigo que montei:

http://maurinsoft.com.br/index.php/2021/02/08/comandos-do-gdb/
Comandos do GDB

A seguir mostrarei como utilizar o debug de forma prática.

Segunda parte do tutorial

Emulando passagem de argumentos

Quando houver necessidade de emular a execução do binário com passagem de argumentos, siga os seguinte passos:

Entre no gdb

gdb [aplicação]

Execute o comando set, passando os argumentos, conforme figura abaixo:

set args [arg1] [arg2] … [arg3]

Por fim inicie a aplicação com o debug.

r

Debug remoto

O Debug remoto, é necessário quando temos uma maquina e o nosso ambiente de desenvolvimento esta em outra.

Desta forma, é possível identificar problemas de hardware ou software na maquina alvo, sem de fato estar alocado nela.

O Debug remoto é divido em 2 parter:

  1. Servidor de debug ou máquina debugada
  2. Ambiente de desenvolvimento

Maquina debugada

Nesta máquina é necessário instalar o servidor de debug. Pois iremos nos conectar nela.

Para funcionar, a maquina precisa ter uma porta TCP liberada para a maquina de desenvolvimento.

O programa que será necessário é o gdbserver, que pode ser baixado no ubuntu pelo comando:

apt install gdbserver

Depois das pré-condições liberadas para seu desenvolvimento, precisamos rodar o gdbserver, através da sintaxe:

gdbserver [aplicacao] [host]:[port] <&>

A aplicação é o binário que deseja ser debugado, como no gdb, precisa ser criado com a opção -g

O host é a o ip que será ouvido, podendo ser localhost

Port , é a porta tcp que será criada, para receber os comandos.

Segue o exemplo abaixo:

Ambiente de desenvolvimento

Agora iremos debugar no ambiente de desenvolvimento, que possui os fontes.

Para isso usaremos o nosso velho gdb.

gdb

target remote localhost:23456

Passando em seguida o target remote [host]:[porta], ligamos o server ao cliente, e conseguimos o debug remoto.

Conforme figura abaixo:

Debug remoto
Blog C/C++
Encontrar um arquivo ou pasta no linux

Segue aqui a dica resumida, para encontrar os detalhes do comando recomendo o site abaixo:

https://www.hostinger.com.br/tutoriais/find-locate-comandos-linux?ppc_campaign=google_performance_max&gclid=CjwKCAjwgviIBhBkEiwA10D2j5gn-zNuacy-dlXGhs4xPyKJ6jg_FxZ6_zFGZaA8Ii0-ZGWZ6oI3vxoCrn4QAvD_BwE

Para buscar uma pasta ou arquivo use o comando no linux:

find <diretorio> -iname “oque procura”

Exemplo de codigo:

find / -iname “stdio.h”

C/C++ Dicas Sem categoria
Desenvolvendo com múltiplos terminais

Em linux, as vezes precisamos de um terminal ou 2 para executar ações que as vezes são necessárias.

Uma dica bem útil para o desenvolvimento é o Terminator.

exibição do terminator

Segue o artigo, que foi baseado este post, espero condensar um pouco os principais comandos.

https://www.tecmint.com/terminator-a-linux-terminal-emulator-to-manage-multiple-terminal-windows/
Artigo de referencia, bem mais completo.

Instalação do terminator

Para instalar no ubuntu, siga os passos a seguir:

apt install terminator

Com isso o terminator será disponibilizado em sua aba gráfica.

Principais comandos

AtalhoDescrição
CTRL+SHIFT+OQuebra Horizontal
CTRL+SHIFT+EQuebra Vertical
CTRL+TABSeleciona aba
CTRL+SHIFT+WFecha aba ativa
F11tela cheia
C/C++ Dicas Sem categoria
Instalando o sublime no Ubuntu

O processo atualizado do sublime do sublime pode ser visto no site:

http://www.sublimetext.com/docs/linux_repositories.thml#apt

Procedimento de instalação

Instale a chave GPG

wget -qO – https://download.sublimetext.com/sublimehq-pub.gpg | sudo apt-key add –

Instale o componente de transporte https

sudo apt-get install apt-transport-https

Adicione o repositório estável

echo “deb https://download.sublimetext.com/ apt/stable/” | sudo tee /etc/apt/sources.list.d/sublime-text.list

Agora atualize e instale o sublime

sudo apt-get update
sudo apt-get install sublime-text

Exemplo de utilização

subl [fonte.c]

Código do sublime

Atalhos do Sublime

CTRL+p

AtalhoO que faz
CTRL+p Busca nos arquivos aberto
CTRL+gindo até a linha
CTRL+rbuscar por função
CTRL+ç;Buscar por palavra chave no arquivo
CTRL+SHIFT+fBusca em arquivos do projeto
CTRL+XApaga linha
CTRL+SHIFT+vColar com endentação
Texto marcado -> TABRecuar
Texto marcado -> SHIFT + TABVoltar Recuo
CTRL+K ; CTRL+bEsconder sidebar/Exibir
CTRL +;Comentar codigo

C/C++
Endentação de código em C

Endentação definição:

ato ou efeito de endentar.

Como o próprio nome diz endentar é deixar o código mais legível e bonito, melhorando o entendimento sobre o mesmo.

Como endentar código em C no Linux

Para endentar o código em C, usaremos o comando indent , que explicaremos a seguir.

Instalação do Indent

A instalação do indent, é extremamente simples, para tanto, usaremos o comando:

apt install indent

O vídeo abaixo mostra como fazer o processo de instalação.

apresentação da instalação do indent

Endentando o código em C

O processo de endentação é muito simples.

Basta digitar o comando como se segue:

indent [nome_do_fonte.c]

O programa irá endentar no padrão, segue um vídeo demonstrando seu uso.

Apresentação prática do indent em código de projeto.

Customizando Endentação

A endentação do código pelo comando indent, pode ser mudada conforme sua necessidade.

No site https://linux.die.net/man/1/indent , voce pode ver a explicação completa das sintaxes disponíveis para o indent.

Estarei explicando poucos comandos estilisticos.

indent -br [codigo_fonte.c]

Forçamos que o { esteja no final da linha que o gerou.

Comando -br

Perceba que o } não entrou na jogada, se incluirmos o parametro -ce, tambem alinharemos ele.

indent -br -ce [codigo_fonte.c]

Conforme figura abaixo:

opções de indent

Declaração de valores

Agora, vamos ver a declaração de valores, com endentação.

O parametro -di, inclui declaração conforme o apresentado:

indent -di16 [fonte.c]

Neste exemplo percebemos um recuo, entre o tipo e seu nome.

recuo do parâmetro -di16

Já o parâmetro indent -di2

indent -di2 [fonte.c]

Separa o tipo de seu nome de variável, pulando uma linha.

Existem uma infinidade de parâmetros do indent. Entre no site, e busque a que melhor se adequa a seu código.

Shell Script
Atualização hora

Para deixar automatizado a atualização de hora, é possível realizar um agendamento para rodar a atualização da data, usando o comando ntpdate.

Desta maneira, sempre que o servidor for aberto, ele auto atualizará.

Procedimento:

Entre na pasta /etc , edit o arquivo crontab

10 * * * * ntpdate -u server ntp.research.gov

10 * * * * ntptime -s server ntp.research.gov

Salve este comando.

Desta forma o pdv será atualizado, de 10 em 10 minutos, sem necessidade de novas modificações.

Servidores de NTP no Brasil

  • server 0.br.pool.ntp.org
  • server 1.br.pool.ntp.org
  • server 2.br.pool.ntp.org
  • server 3.br.pool.ntp.org

Blog treinamentos
Documentando seu Negócio

A medida que as empresas crescem, é normal que seu negócio ganhe além de volume, também complexidade.

O crescimento dos negócios faz em parte, também agregar em seus produtos, cada vez mais requisitos.

Criando um paralelo com a natureza, as empresas são como dinossáuros.

Começam como pequenas empresas, pequenas como ovos de dinossauro. Mas a medida que os anos passam, com novos projetos e novas implementações muita coisa muda.

Seus projetos crescem em requisitos, ganhando novas funcionalidades, muitas regras e várias ramificações.

Se tornando dinossauros gigantescos.

Sobre meu ponto de vista, não há nada errado em crescer.

O crescimento e aumento de complexidade é uma expressão natural, que exprime a ideia que um software se tornou versátil, e por vezes adaptativo, tanto a necessidades como a contextos de negócio.

O problema mais fundamental, é que projetos embrionários, são facilmente analisáveis, porem a medida que estes crescem. Cresce tambem sua dificuldade em analisar e solucionar problemas.

Tenho visto em minha vida profissional, mais constantemente. Que o sucesso, muitas vezes é acompanhado de muitos problemas.

Conhecimento é poder

Muitas vezes a empresa com foco total no cliente, atropela as boas práticas de gestão, confiando em processos e pessoas para manter sua produção.

Processos são de fato, protocolos que assumimos, estes precisam ser conhecidos, e seu treinamento exige formação prévia.

Pessoas são de fato, a parte mais sensível das empresas, pois muitas vezes possuem conhecimento vasto sobre os processos, e de fato, acaba sendo perdido em um eventual desligamento.

Centralização do conhecimento

A questão mais fundamental hoje, é que as pessoas podem sair, pessoas podem entrar, mas o conhecimento dos protocolos, do negocio deve permanecer.

Isso de fato, é de aceitação comum, pois hoje sabemos o custo dessa perda.

Como manter o conhecimento da sua empresa

De forma geral, em sistemas da informação, podemos dividir o conhecimento em 3 partes:

Para não ser muito técnico, vou apresentar um exemplo simples.

Um bolo, sim esses de loja de doces

Pensando no bolo, temos 3 tipos de informação

Do negócio

O bolo é uma mercadoria, então temos a gestão do negócio em si, como vender, as regras da venda, a questão dos tipos, os clientes, etc.

A documentação sobre o negócio, diz pouco sobre o bolo em sí, mas explica como este bolo será entregue, as pessoas, e o processo de entrega.

Do cliente

O bolo é entregue aos clientes, que por sua vez exigem uma série de documentos, tais como:

  • Tabela calórica
  • Valores nutricionais
  • Contra indicação
  • Validade e rastreabilidade

De forma geral, as documentações exigidas, são de fato as menos negligenciadas, pois são impostas pelo cliente, muitas vezes contando até de contratos formais.

Do bolo em si

Aqui esta a documentação muitas vezes a mais negligenciada.

As informações do bolo, são as receitas, equipamentos necessários e por vezes dependencias.

Nelas não só estão como é feita, mas também as dependências para seu preparo.

Realidade da vida

A maioria das vezes, tratamos com seriedade as documentações do cliente, que entregamos a cada entrega. Quando podemos a do negócio, mas muitas vezes deixamos as especificações do bolo, pois acreditamos que as pessoas as detém.

Na vida real o padeiro morre, muda de empresa, ou vira motorista de aplicativo.

E as empresas deixam de conhecer as informações, passando do sucesso ao desespero.

Solução

Estarei nos próximos artigos apresentando algumas soluções possíveis para todos os casos narrados, apresentando pontos focados para cada um das atividades que apresentei.

C/C++
Comunicação Linux USB e Bluetooth

Muitas vezes temos a necessidade de realizar comunicação direta com dispositivos USB e/ou Bluetooth.

A Lib hidapi, permite realizar a comunicação através destes dispositivos, em sistemas windows, linux e mac.

Estarei apresentando brevemente esta api, e detalhando um pouco de sua instalação.

GIT da api

https://github.com/signal11/hidapi

Documentação do fabricante

O Projeto do GIT pode ser visto em:

https://github.com/libusb/hidapi

o processo de instalação pode ser visto em:

https://github.com/libusb/hidapi#installing-hidapi

Instalação no Linux

A instalação para execução necessita apenas da lib.

apt install libhidapi

Porem se voce quer desenvolver, precisará instalar o pacote de desenvolvimento:

apt install libhidapi-dev

Pacotes acessórios

apt install libhidapi-libusb libhidapi-hidraw

O hidraw é usado para integração com o kernel do linux e suporta o desenvimento de usb e bluetooth.

Já o usb é usado diretamente na camada de aplicação. Caso se deseja construir apenas uma das opções, a outra pode ser não utilizada.

Exemplo de código

#ifdef WIN32
#include <windows.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include "hidapi.h"

#define MAX_STR 255

int main(int argc, char* argv[])
{
	int res;
	unsigned char buf[65];
	wchar_t wstr[MAX_STR];
	hid_device *handle;
	int i;

	// Initialize the hidapi library
	res = hid_init();

	// Open the device using the VID, PID,
	// and optionally the Serial number.
	handle = hid_open(0x4d8, 0x3f, NULL);

	// Read the Manufacturer String
	res = hid_get_manufacturer_string(handle, wstr, MAX_STR);
	wprintf(L"Manufacturer String: %s\n", wstr);

	// Read the Product String
	res = hid_get_product_string(handle, wstr, MAX_STR);
	wprintf(L"Product String: %s\n", wstr);

	// Read the Serial Number String
	res = hid_get_serial_number_string(handle, wstr, MAX_STR);
	wprintf(L"Serial Number String: (%d) %s\n", wstr[0], wstr);

	// Read Indexed String 1
	res = hid_get_indexed_string(handle, 1, wstr, MAX_STR);
	wprintf(L"Indexed String 1: %s\n", wstr);

	// Toggle LED (cmd 0x80). The first byte is the report number (0x0).
	buf[0] = 0x0;
	buf[1] = 0x80;
	res = hid_write(handle, buf, 65);

	// Request state (cmd 0x81). The first byte is the report number (0x0).
	buf[0] = 0x0;
	buf[1] = 0x81;
	res = hid_write(handle, buf, 65);

	// Read requested state
	res = hid_read(handle, buf, 65);

	// Print out the returned buffer.
	for (i = 0; i < 4; i++)
		printf("buf[%d]: %d\n", i, buf[i]);

	// Close the device
	hid_close(handle);

	// Finalize the hidapi library
	res = hid_exit();

	return 0;
}

No exemplo acima temos alguns fragmentos importantes.

hid_init

Esta função inicializa a biblioteca;

hid_open

A função hid_open, carrega o device, sempre pedindo o VID e o PID do dispositivo USB.

hid_close

A função close, descarrega a função, tendo ser chamada ao fim de sua execução.

maurinsoft.com.br