Novidades no site
Em breve publicarei novidades relacionadas ao aprendizado de equipes.
Espero agilizar os aspectos de treinamento interno nas empresas de TI.
Em breve publicarei novidades relacionadas ao aprendizado de equipes.
Espero agilizar os aspectos de treinamento interno nas empresas de TI.
Este artigo é uma continuação do treinamento apresentado no artigo abaixo:
Agora iremos falar um pouco sobre as informações dos grupos no linux.
O arquivo /etc/group, é um banco de dados de grupos de usuários, os grupos são usados para permissões de acesso, pois em geral, estabelecemos permissões para o usuário, para os membros de seu grupo e depois para os outros usuários.

Ao olharmos o grupo mmm, percebemos que tem o mesmo nome e codigo do usuario (/etc/passwd). Ao criarmos um usuário, o linux automáticamente cria um um grupo para este.
| Número de CAMPO | Dados de exemplo | Descrição |
| 1 | mmm | O nome do grupo |
| 2 | x | A senha do grupo (se existir) |
| 3 | 1000 | O numero de id do grupo |
| 4 | A lista de nomes de usuários que pertencem a esse grupo |
Agora vamos estudar o código abaixo, que é basicamente uma continuação do código do primeiro artigo.
#include <unistd.h>
#include <stdio.h>
#include <pwd.h>
#include <grp.h>
#include <sys/types.h>
void main(){
long uid = getuid();
long gid = getgid();
char nomegrupo[40];
printf("\nMeu id %ld\n",uid);
printf("Meu group id %ld\n",gid);
struct group *gp= getgrgid(gid);
printf("Meu nome do grupo %s",gp->gr_name);
struct passwd *ppw;
int erro = 0;
ppw = NULL;
printf("Listagem de usuarios\n=======================\n");
//pww = getpwent( ); /*Obtem a senha*/
while((ppw = getpwent())!=NULL){
if(erro !=0) {
printf("Falhou\n ");
//abort();
} else {
printf("Usuario:%s\n",ppw->pw_name);
printf("senha:%s\n",ppw->pw_passwd);
printf("id de usuario:%d\n",ppw->pw_uid);
printf("id do grupo:%d\n"a,ppw->pw_gid);
/*Pega as informações do grupo*/
gid = ppw->pw_gid; /*Pega o grupo do usuario*/
gp = getgrgid(gid);
/*Mostra os grupos*/
printf("Nome do grupo %s",gp->gr_name);
printf("Senha do grupo %s",gp->gr_passwd);
printf("id do grupo %d",gp->gr_gid);
for( int cont= 0; gp->gr_mem[cont]!=0;++cont) {
printf("membros do grupo %s", gp->gr_mem[cont]);
}
/*O resto das informações do usuario*/
printf("comentario:%s\n",ppw->pw_gecos);
printf("diretorio:%s\n",ppw->pw_dir);
printf("shell:%s\n", ppw->pw_shell);
}
printf("\n");
}
}
Neste código, podemos ver 2 fragmentos importantes:
#include <unistd.h>
#include <stdio.h>
#include <pwd.h>
#include <grp.h>
#include <sys/types.h>
void main(){
long uid = getuid();
long gid = getgid();
char nomegrupo[40];
printf("\nMeu id %ld\n",uid);
printf("Meu group id %ld\n",gid);
struct group *gp= getgrgid(gid);
printf("Meu nome do grupo %s",gp->gr_name);
struct passwd *ppw;
int erro = 0;
ppw = NULL;
Neste pequeno fragmento, a lib responsável pelo gerenciamento do grupo, é
#include <grp.h>
Para comecarmos, vamos apresentar a estrutura de um grupo:
struct group {
char *gr_name; /* nome do grupo */
char *gr_passwd; /* senha do grupo */
gid_t gr_gid; /* id do grupo */
char **gr_mem; /* membros do grupo */
}
Abre a listagem e pega a primeira ocorrencia do grupo. Funcionando como um cursor, para capturar todos os registros do grupo.
while ( ( gp = getgrent())!=0){
printf("%s", gp->gr_name);
}
endgrent();
No caso do exemplo acima, só para quando o ultimo registro for encontrado.
É usado em conjunto com a função getgrent, ela faz voltar para a posição inicial.
while ( ( gp = getgrent())!=0){
printf("%s", gp->gr_name);
endgrent();
}
Nesta sutil variação do código, será mostrada sempre o primeiro registro.
Pesquisa o grupo, pegando a estrutura identificada pela chave gid (Group ID).
printf("\nMeu id %ld\n",uid);
printf("Meu group id %ld\n",gid);
struct group *gp= getgrgid(gid);
printf("Meu nome do grupo %s",gp->gr_name);
No fragmento acima, podemos ver que funciona, inclusive acompanhar sua sintaxe.
Função semelhante a anterior, porem em vez de pegar o id, ela procura o grupo que contenha o nome do grupo.
SIntaxe:
char nome[20];
sprintf(nome,"mmm");
struct group *gp = getgrnam(nome);
printf("ID grupo: %d",gp->gr_gid);
Bom pessoal, por enquanto isso é tudo!
Espero ve-los em breve.
E se curtiu o texto, ou acha que poderiamos melhorar, envie-nos um email
marcelomaurinmartins@gmail.com
Até breve e vida longa e prospera.
A linguagem C é uma linguagem dinâmica, ainda mais com Linux, que foi feito nesta linguagem.
Iremos começar a navegar nas interações da linguagem C com o linux.
Nesta nossa primeira jornada, iremos explorar como descobrir o usuário conectado.
Ao criarmos um usuário, o linux registra este na pasta /etc/, mais especificamente no passwd.

No exemplo a cima, podemos ver que o usuario mmm, tem a representação, conforme apresentado abaixo:
mmm:x:1000:1000:mmm,,,:/home/mmm:/bin/bash
Se olharmos a estrutura deste podemos identificar, a seguinte ordem:
user:x:1001:1001:user,,,:/home/user:/bin/bash
estrutura do arquivo passwd
[–] – [–] [–] [—–] [——–] [——–]
| | | | | | |
| | | | | | +-> 7. Login shell
| | | | | +———-> 6. Home directory
| | | | +——————–> 5. GECOS
| | | +————————–> 4. GID
| | +——————————-> 3. UID
| +———————————–> 2. Password
+—————————————-> 1. Username
Os principais componentes deste fragmento, são o UID e o GID.
O UID é o User Identification – Que é um número único, que identifica o usuário
O GID é o Group Identification – Que identifica o grupo pertencente aquele usuário, este arquivo, esta associado ao arquivo /etc/groups, que auxilia na criação de permissões.
Quando voce loga no linux, utiliza as suas credenciais, login e senha. Desta forma sua aplicação precisa saber como pegar tal informação.
As informações do usuário logado, podem ser obtidas através da biblioteca unistd.h, entre suas várias funções estão duas:
Abaixo, traremos o main.c, que é um exemplo bem simples do uso da biblioteca.
#include <unistd.h>
#include <stdio.h>
void main(){
printf("\nMeu id %i\n",getuid());
printf("Meu group id %i\n",getgid());
}
No exemplo capturamos de forma direta o getuid e o getgid, onde mostramos os mesmos em uma mensagem.
all: compile
compile:
gcc main.c -o ex01
No fragmento acima, temos o arquivo Makefile, ja nosso amigo de longa data, responsável pela compilação propriamente dita.

Este segundo programa, é um pouco mais complicado, ele varre a listagem de todos os usuarios, apresentando o conteúdo do passwd, e relacionando, conforme a estrutura do passwd.
#include <unistd.h>
#include <unistd.h>
#include <unistd.h>
#include <unistd.h>
#include <stdio.h>
#include <pwd.h>
#include <sys/types.h>
void main(){
long uid = getuid();
long gid = getgid();
printf("\nMeu id %ld\n",uid);
printf("Meu group id %ld\n",gid);
struct passwd *ppw;
int erro = 0;
ppw = NULL;
printf("Listagem de usuarios\n=======================\n");
//pww = getpwent( ); /*Obtem a senha*/
while((ppw = getpwent())!=NULL){
if(erro !=0) {
printf("Falhou\n ");
//abort();
} else {
printf("Usuario:%s\n",ppw->pw_name);
printf("senha:%s\n",ppw->pw_passwd);
printf("id de usuario:%d\n",ppw->pw_uid);
printf("id do grupo:%d\n",ppw->pw_gid);
printf("comentario:%s\n",ppw->pw_gecos);
printf("diretorio:%s\n",ppw->pw_dir);
printf("shell:%s\n", ppw->pw_shell);
}
printf("\n");
}
}
Temos como saída o exemplo que se segue:

A função getpwuid retorna a estrutura passwd, igual a anterior, porem, ela pega apenas a de um uid especifico, utilizado para pesquisar a informação de user id.
struct passwd *getpwuid(uid_t uid);
Pesquisa por login,
struct passwd *getpwnam(const char* name);
CUDA Toolkit é um conjunto de ferramentas desenvolvidas para programação em GPU.
Este processo tambem foi testado em uma máquina Ubuntu 20.04.02.
Informações relacionadas ao Toolkit:
https://developer.nvidia.com/cuda-toolkit
Para instalação é necessário verificar a sua distribuição, no caso do ubuntu ou xubuntu 18.04.
Siga os passos abaixo:
Baixe o arquivo pin
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-ubuntu1804.pin
Mova para o repositório de pacotes
sudo mv cuda-ubuntu1804.pin /etc/apt/preferences.d/cuda-repository-pin-600
Baixe agora o pacote cuda.
wget https://developer.download.nvidia.com/compute/cuda/11.4.1/local_installers/cuda-repo-ubuntu1804-11-4-local_11.4.1-470.57.02-1_amd64.deb
Instale o pacote conforme o comando abaixo:
sudo dpkg -i cuda-repo-ubuntu1804-11-4-local_11.4.1-470.57.02-1_amd64.deb
Adicione a chave do repositório
sudo apt-key add /var/cuda-repo-ubuntu1804-11-4-local/7fa2af80.pub
Por fim atualize a lista de pacotes:
sudo apt-get update
sudo apt-get upgrade
Baixando o pacote cuda, e suas dependencias.
sudo apt-get -y install cuda


As informações aqui fornecidas, foram retiradas do site:
Referencia:
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin
sudo mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget https://developer.download.nvidia.com/compute/cuda/11.5.1/local_installers/cuda-repo-ubuntu2004-11-5-local_11.5.1-495.29.05-1_amd64.deb
sudo dpkg -i cuda-repo-ubuntu2004-11-5-local_11.5.1-495.29.05-1_amd64.deb
sudo apt-key add /var/cuda-repo-ubuntu2004-11-5-local/7fa2af80.pub
sudo apt-get update
sudo apt-get -y install cuda


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.
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/

Após esta etapa, agora iremos instalar o cartão no raspberry, e liga-lo.
Após a gravação do cartão, e ter ligado o raspberry pi.

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:

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.


Por padrão o usuário e senha são:
Recomendamos que faça a mudança o mais brevemente possível destes.
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.

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.

Pronto sua maquina agora encontrará o
Para conectar via SSH será necessário usar um cliente ssh, no meu caso uso o bitvise

As informações de conexão são:
Agora vc pode trabalhar diretamente no servidor

Em breve estarei adicionando novos postas, pois também sou aluno como você, e a medida que aprendo, publicarei novos posts.
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:
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.
Crie uma pasta no seu linux chamado sample, nela realize as seguintes operações:
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.
Neste tutorial, apresentaremos o básico necessário para permitir a criação de uma aplicação, inclusive debugar quando necessá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:
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:
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 é 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.
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:
A seguir mostrarei como utilizar o debug de forma prática.
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
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:
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:

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:

Segue aqui a dica resumida, para encontrar os detalhes do comando recomendo o site abaixo:
Para buscar uma pasta ou arquivo use o comando no linux:
find <diretorio> -iname “oque procura”
Exemplo de codigo:
find / -iname “stdio.h”
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.

Segue o artigo, que foi baseado este post, espero condensar um pouco os principais comandos.
Para instalar no ubuntu, siga os passos a seguir:
apt install terminator
Com isso o terminator será disponibilizado em sua aba gráfica.
| Atalho | Descrição |
| CTRL+SHIFT+O | Quebra Horizontal |
| CTRL+SHIFT+E | Quebra Vertical |
| CTRL+TAB | Seleciona aba |
| CTRL+SHIFT+W | Fecha aba ativa |
| F11 | tela cheia |
O processo atualizado do sublime do sublime pode ser visto no site:
http://www.sublimetext.com/docs/linux_repositories.thml#apt
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]

CTRL+p
| Atalho | O que faz |
| CTRL+p | Busca nos arquivos aberto |
| CTRL+g | indo até a linha |
| CTRL+r | buscar por função |
| CTRL+ç; | Buscar por palavra chave no arquivo |
| CTRL+SHIFT+f | Busca em arquivos do projeto |
| CTRL+X | Apaga linha |
| CTRL+SHIFT+v | Colar com endentação |
| Texto marcado -> TAB | Recuar |
| Texto marcado -> SHIFT + TAB | Voltar Recuo |
| CTRL+K ; CTRL+b | Esconder sidebar/Exibir |
| CTRL +; | Comentar codigo |