C/C++
Como verificar grupo no linux com C

Este artigo é uma continuação do treinamento apresentado no artigo abaixo:

http://maurinsoft.com.br/index.php/2021/08/27/como-verificar-user-no-linux-com-c/

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.

lista de grupos da minha maquina.

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.

Tabela das informações do /etc/group

Número de CAMPODados de exemploDescrição
1mmmO nome do grupo
2xA senha do grupo (se existir)
31000O numero de id do grupo
4A lista de nomes de usuários que pertencem a esse grupo

Vamos ao código em C

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>

Funções de gestão de grupo

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 */
}

GETGRENT

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.

ENDGRENT

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

GETGRGID

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.

GETGRNAM

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.

C/C++ Dicas Sem categoria
Como verificar user no Linux com C

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.

Exemplo do arquivo 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
[–] – [–] [–] [—–] [——–] [——–]
| | | | | | |
| | | | | | +-> 7. Login shell
| | | | | +———-> 6. Home directory
| | | | +——————–> 5. GECOS
| | | +————————–> 4. GID
| | +——————————-> 3. UID
| +———————————–> 2. Password
+—————————————-> 1. Username

estrutura do arquivo passwd

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.

Lendo o UID e o GID do usuário conectado

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:

  • gid_t getgid(void)
  • gid_t getegid(void)

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.

Listando as informações /etc/passwd

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:

estrutura do passwd

Outras funções semelhantes

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);

Blog C/C++ CUDA IA pós graduação Python
Install CUDA toolkit em xubuntu 18.04

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

Etapas intermediarias de instalação do CUDA
Processo final baseado no apt do pacote.

As informações aqui fornecidas, foram retiradas do site:

https://developer.nvidia.com/cuda-downloads?target_os=Linux&target_arch=x86_64&Distribution=Ubuntu&target_version=18.04&target_type=deb_local

Procedimento Ubuntu 20.04

Referencia:

https://developer.nvidia.com/cuda-downloads?target_os=Linux&target_arch=x86_64&Distribution=Ubuntu&target_version=20.04&target_type=deb_local

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

Tela da instalação do CUDA em UBUNTU 20.04
Finalização da Instalação do CUDA

Outros artigos

    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

    en_USEnglish