quarta-feira, 5 de abril de 2017

Recursos pouco utilizados da string de formatação do printf do C

Alguns recursos pouco utilizados da string de formatação do comando printf no C são muitas vezes ignorados ou desconhecidos. A imagem abaixo do código fonte "exemplo.c", foi feita a partir do vídeo: Recursos pouco conhecidos do printf. O vídeo demostra as mesmas informações aqui colocadas.


- Imprimir váriaveis pela posição dos argumentos

Uma das coisas realmente pouco conhecidas ou pouco utilizadas é que nós temos em C como mudar a ordem exibição sem alterar a ordem de argumentos. Isso é muito similar com a opção do Python:

'{1} {0}'.format('one', 'two')

Na imagem acima, linha 8, é demostrado como realizar isso em C. A formatação "%2$" informa ao printf que o segundo argumento deve ser utilizado, no caso da linha 8, é o valor contido na variável valor. Sendo assim, a formatação "%1$" diz que o primeiro argumento será utilizado.

printf("%5$6d", _, _, _, _, 42, _);

O exemplo acima diz que o valor 42 deve ser impresso. Vamos entender a linha acima. "%5$" diz que o quinto argumento após a formatação será utilizado e, nesse caso, é 42. A parte depois do dolar ($), "6d", simplesmente diz que o caracter inteiro deve ser impresso com tamanho mínimo de 6 caracteres e alinhado a direita. Nesse caso, o valor 42 possui apenas 2 caracteres. Sendo assim, o printf irá imprimir 4 espaços antes de imprimir o valor 42.


- Imprimir váriaveis alinhadas à esquerda

Sempre que utilizamos a formatação de algum argumento como "%d", para inteiros, ou "%s", para strings, ou "%f", para valores fracionários, os mesmos são alinhados a direita sem uma previsão de tamanho que a variável irá ocupar. Quando inserimos um numero entre o "%" e a letra, nos criamos uma previsão de tamanho mínimo para o campo sendo formatado. Mas, alguma vez já se perguntou como fazer o alinhamento a esquerda?

O alinhamento à esquerda pode ser feito informando um número negativo.

printf("%-6d", 42);

O exemplo acima faz com que o printf imprima o valor 42 e, em seguida, imprima 4 espaços. Ja que foi dito que a previsão do tamanho era 6 caracteres.


- Imprimir strings sem imprimir todo o conteúdo

A linha 9 da imagem acima, demostra como pode ser exibido apenas alguns caracteres da string e não toda a string. Vamos utilizar outro exemplo:

printf("%.9s", "aventuras de um devop");

Isso diz ao printf que uma string (%s) será utilizada, no caso "aventuras de um devop" é a string. Observe que depois do porcento (%), há um ponto e um número. Nesse caso do exemplo acima, o número é 9. Sendo assim, temos a mascara "%.9s", a string que esta sendo passada será impressa até o nono caracter incluso. Nesse caso, a saída desse programa será:

aventuras

E não

aventuras de um devop

No exemplo anterior, da linha 9 da imagem acima, a string deve ser impressa até o sétimo caracter incluso. Nesse caso, o valor impresso será "exemplo" e, não, "exemplo.c".

domingo, 12 de março de 2017

Instalando máquinas com o virt-install


Vamos instalar um Ubuntu Server 16.04.02 LTS que é a última versão até a presente data dessa publicação. Para começar vamos instale os utilitários necessarios seguindo o post: Instalando máquinas com o virt-manager.

O vídeo Instalando um Linux com o comando virt-install demostra o conteúdo desse post.

Para instalar o Ubuntu que foi feito download (para o diretorio ~/VMs/Isos), execute:

rlucca@millie:~$ virt-install --name ubuntu-server-16-lts \
> --cdrom ~/VMs/Isos/ubuntu-16.04.2-server-amd64.iso      \
> --vcpus 1 --cpu=host --memory 512                       \
> --network network=default,model=virtio                  \
> --disk pool=VMs,size=20_

Vamos ver cada um desses parâmetros:
  • --name será utilizado para o nome da VM (máquina virtual) ou dominio;
  • --cdrom especifica o caminho completo local onde está a ISO à ser instalada;
  • --vcpus especifica a quantidade de processadores que a nova máquina simulará;
    • Cabe chamar atenção que é possivel fazer --vcpus 1,cores=2;
  • --cpu especifica o tipo de cpu (host significa o mesmo tipo que a estação física);
    • host: mesmo tipo da estação física;
    • É possível fazer diversos tipos de configuração de caracteristicas do processador e/ou utilizar modelos de processadores diferentes que o físico;
  • --memory especifica quantos MB de memória serão utilizados;
  • --network especifica como deve ser criada a placa de rede virtual;
    • No caso esta sendo criada uma placa do tipo network que utiliza a entrada default do net-list com o modelo virtio e não, por exemplo, rtl8139;
  • --disk especifica a localização onde esta salvo o HD da VM;
    •  Foi utilizado a opção de indicar o pool e o tamanho (size) que faz com que seja criado o volume usado pela máquina virtual (o nome do volume é o mesmo da máquina).

A manipulação de VMs pode ser feita pelo comando virsh. Esse comando pode ser usado sem nenhum argumento para abrir um shell ou com parâmetros que seriam a linha digitada dentro do shell que ele abriria...

Vamos ver alguns comandos:
  • list --all: Lista todos as VMs existentes (ativas ou não);
  • list: Lista todas as VMs ligadas existentes;
  • start nome: Inicia uma VM existente chamada 'nome';
  • shutdown nome: Envia uma solicitação para desligar a VM chamada 'nome';
  • destroy nome: Desliga forçadamente a VM chamada 'nome';
  • undefine nome: Apaga a configuração da VM chamada 'nome';
  • pool-list: Lista todos os pools ativos;
  • vol-list --pool nome: Lista todos os volumes (HDs) que existem no pool chamado 'nome';
  • vol-delete --pool nome1 nome2: Apaga o volume chamado 'nome2' que deve estar dentro do pool ativo chamado 'nome1';

Algumas explicações adicionais sobre a utilização da libvirt sobre a configuração de rede e como isso afeta o firewall existente do host pode ser visto nesse post do blog rabexc.

Uma coisa muito boa é que o virt-install pode ser utilizado  com a opção '--graphics none' para fazer com que seja utilizado a interface serial do Linux sendo instalado. Dessa forma, a interação toda acontece no próprio console que o comando foi chamado. Sendo assim, é possível fazer um script usando o expect para automatizar a instalação.

sexta-feira, 10 de março de 2017

Instalando máquinas com o Virt-Manager

A LibVirt é uma biblioteca muito utilizada por quem faz virtualização para conversar com os diversos tipos de hypervisor (Google diz que em português seria hipervisor, mas vou manter o uso do y). Se nunca ouviu falar dela, não se preocupe! Alguns utilitários, criados com essa biblioteca, são o virsh, virt-install e virt-manager que configuram e permitem a ativação de uma máquina virtual completa.

O vídeo do Youtube Instalando Linux usando o Virt-Manager mostra como se faz para instalar duas máquinas, cada uma contendo um Linux diferente sendo que as versões instaladas são: Debian 8 e CentOS 7. O hypervisor usado por padrão, no vídeo, é o kvm. Entretanto, o vídeo não comentou quais pacotes precisam ser instalados.

No Ubuntu Desktop 16.04 LTS, basta executar:

rlucca@millie:~$ sudo apt install -y virtinst_

O pacote virtinst deve fazer com que todas as dependencias necessarias sejam instaladas, alem disso a opção '-y' deve fazer com que em qualquer pergunta de confirmação a opção 'yes' (sim) seja escolhida automaticamente. Sendo assim, o comando virt-install, virt-manager e virsh estão instalados. O virt-install é mostrado a seguir.

rlucca@millie:~$ virt-install --version
1.3.2
rlucca@millie:~$ virt-install --help
usage: virt-install --name NAME --ram RAM STORAGE INSTALL [opti

Create a new virtual machine from specified install media.

optional arguments:
  -h, --help            show this help message and exit
  --version             show program's version number and exit
  --connect URI         Connect to hypervisor with libvirt URI

General Options:
  -n NAME, --name NAME  Name of the guest instance
  --memory MEMORY       Configure guest memory allocation. Ex:
                        --memory 1024 (in MiB)
                        --memory 512,maxmemory=1024
  --vcpus VCPUS         Number of vcpus to configure for your g
                        --vcpus 5
                        --vcpus 5,maxcpus=10,cpuset=1-4,6,8
                        --vcpus sockets=2,cores=4,threads=2,
  --cpu CPU             CPU model and features. Ex:
                        --cpu coreduo,+x2apic
                        --cpu host
  --metadata METADATA   Configure guest metadata. Ex:
                        --metadata name=foo,title="My pretty ti
                        --metadata description="My nice long de

Installation Method Options:
  --cdrom CDROM         CD-ROM installation media
  -l LOCATION, --location LOCATION
                        Installation source (eg, nfs:host:/path,
                        http://host/path, ftp://host/path)
  --pxe                 Boot from the network using the PXE pro
  --import              Build guest around an existing disk ima
  --livecd              Treat the CD-ROM media as a Live CD
  -x EXTRA_ARGS, --extra-args EXTRA_ARGS
                        Additional arguments to pass to the ins
                        booted from --location
  --initrd-inject INITRD_INJECT
                        Add given file to root of initrd from -
  --os-variant DISTRO_VARIANT
                        The OS variant being installed guests, 
                        'fedora18', 'rhel6', 'winxp', etc.
  --boot BOOT           Configure guest boot settings. Ex:
                        --boot hd,cdrom,menu=on
                        --boot init=/sbin/init (for containers)
  --idmap IDMAP         Enable user namespace for LXC container
                        --idmap uid_start=0,uid_target=1000,uid

Device Options:
  --disk DISK           Specify storage with various options. E
                        --disk size=10 (new 10GiB image in defa
                        --disk /my/existing/disk,cache=none
                        --disk device=cdrom,bus=scsi
                        --disk=?
  -w NETWORK, --network NETWORK
                        Configure a guest network interface. Ex
                        --network bridge=mybr0
                        --network network=my_libvirt_virtual_ne
                        --network network=mynet,model=virtio,ma
                        --network none
                        --network help
  --graphics GRAPHICS   Configure guest display settings. Ex:
                        --graphics vnc
                        --graphics spice,port=5901,tlsport=5902
                        --graphics none
                        --graphics vnc,password=foobar,port=591
  --controller CONTROLLER
                        Configure a guest controller device. Ex
                        --controller type=usb,model=ich9-ehci1
  --input INPUT         Configure a guest input device. Ex:
                        --input tablet
                        --input keyboard,bus=usb
  --serial SERIAL       Configure a guest serial device
  --parallel PARALLEL   Configure a guest parallel device
  --channel CHANNEL     Configure a guest communication channel
  --console CONSOLE     Configure a text console connection bet
                        and host
  --hostdev HOSTDEV     Configure physical USB/PCI/etc host dev
                        shared with the guest
  --filesystem FILESYSTEM
                        Pass host directory to the guest. Ex: 
                        --filesystem /my/source/dir,/dir/in/gue
                        --filesystem template_name,/,type=templ
  --sound [SOUND]       Configure guest sound device emulation
  --watchdog WATCHDOG   Configure a guest watchdog device
  --video VIDEO         Configure guest video hardware.
  --smartcard SMARTCARD
                        Configure a guest smartcard device. Ex:
                        --smartcard mode=passthrough
  --redirdev REDIRDEV   Configure a guest redirection device. E
                        --redirdev usb,type=tcp,server=192.168.
  --memballoon MEMBALLOON
                        Configure a guest memballoon device. Ex
                        --memballoon model=virtio
  --tpm TPM             Configure a guest TPM device. Ex:
                        --tpm /dev/tpm
  --rng RNG             Configure a guest RNG device. Ex:
                        --rng /dev/random
  --panic PANIC         Configure a guest panic device. Ex:
                        --panic default

Guest Configuration Options:
  --security SECURITY   Set domain security driver configuratio
  --numatune NUMATUNE   Tune NUMA policy for the domain process
  --memtune MEMTUNE     Tune memory policy for the domain proce
  --blkiotune BLKIOTUNE
                        Tune blkio policy for the domain proces
  --memorybacking MEMORYBACKING
                        Set memory backing policy for the domai
                        --memorybacking hugepages=on
  --features FEATURES   Set domain  XML. Ex:
                        --features acpi=off
                        --features apic=on,eoi=on
  --clock CLOCK         Set domain  XML. Ex:
                        --clock offset=localtime,rtc_tickpolicy
  --pm PM               Configure VM power management features
  --events EVENTS       Configure VM lifecycle management polic
  --resource RESOURCE   Configure VM resource partitioning (cgr

Virtualization Platform Options:
  -v, --hvm             This guest should be a fully virtualize
  -p, --paravirt        This guest should be a paravirtualized 
  --container           This guest should be a container guest
  --virt-type HV_TYPE   Hypervisor name to use (kvm, qemu, xen,
  --arch ARCH           The CPU architecture to simulate
  --machine MACHINE     The machine type to emulate

Miscellaneous Options:
  --autostart           Have domain autostart on host boot up.
  --wait WAIT           Minutes to wait for install to complete
  --noautoconsole       Don't automatically try to connect to t
                        console
  --noreboot            Don't boot guest after completing insta
  --print-xml [XMLONLY]
                        Print the generated domain XML rather t
                        guest.
  --dry-run             Run through install process, but do not
                        or define the guest.
  --check CHECK         Enable or disable validation checks. Ex
                        --check path_in_use=off
                        --check all=off
  -q, --quiet           Suppress non-error output
  -d, --debug           Print debugging information

Use '--option=?' or '--option help' to see available suboptions
See man page for examples and full option syntax.

- Não sei qual pacote instalar no Fedora/CentOS.

Utilize o YUM ou o DNF para listar qual pacote precisa ser instalado:

rlucca@millie:~$ sudo dnf provides '*/virt-manager'_

Ou

rlucca@millie:~$ sudo yum provides '*/virt-install'_

- Não sei qual pacote instalar no Debian/Ubuntu.

Utilize o DPKG para listar quais pacotes citam o texto "virt-manager":

rlucca@millie:~$ dpkg -S 'virt-manager'_

terça-feira, 7 de março de 2017

Linha de comando

Eu estava vendo como que se faz para exibir uma linha de comando. Nesse blog learnertobegginer, utilizei o que ele sugere para fazer um estilo próprio de linha de comando (precisei acrescentar o display e o overflow). Aproveitei o estudo e pensei em utilizar o sistema de sintaxe que eles usam. Entretanto, tive problemas com a utilização dele no protocolo HTTPS e voltei atrás por enquanto.

O estilo ficou assim:

<style type="text/css">
.cli {
  color: #6aa84f;
  background: #000000;
  border: 1px double #CCCCCC;
  padding: 10px;
  display: block;
  overflow: hidden;
}
</style>

E o resultado de um:

<pre class="cli">rlucca@millie:~$ ls_
0123456789abcdefghij0123456789abcdefghij0123456789abcdefghij0123456789abcdefghij0123456789abcdefghij</pre>

Fica assim:

rlucca@millie:~$ ls_
0123456789abcdefghij0123456789abcdefghij0123456789abcdefghij0123456789abcdefghij0123456789abcdefghij

Como é possível notar, conteúdo excedente é cortado (por causa do overflow) conforme esperava!

domingo, 5 de março de 2017

Removendo usuários no Ubuntu 16.04

Criei um canal no Youtube para vídeos tutoriais!

O primeiro é explicando como remover um usuário no Ubuntu.

Segue o link para verificar: https://youtu.be/yEwhy9P2ZAk


Os passos são mais ou menos esses:
  1. Abrir o user account;
  2. Clicar no cadeado para ter permissão de administrador (seu usuário precisa ter permissão de fazer sudo);
  3. Clicar no usuário e depois - (menos) que tem em baixo da listagem de usuários.

sexta-feira, 3 de março de 2017

O que é um hypervisor?


Para explicar isso vamos pensar que voce tem um computador que não usa mais. Esse computador, vamos referencia-lo como Host (Estação). Nele um hypervisor pode ser instalado. O hypervisor nada mais é um servidor, uma aplicação, que permite simular um outro computador no Host no qual ele é instalado. O ambiente simulado é chamado Guest (Convidado).

Os hypervisors podem ser classificados em dois tipos. O hypervisor, propriamente, dito é quando ele simula uma máquina completa para executar seja lá qual for o ambiente que o usuário que instalou ele deseja. Já o hypervisor leve é, normalmente, chamado de container. Ele pode ser pensado como o antigo jail do freebsd. Isso quer dizer que um serviço que precisa ser executado não terá um ambiente simulado e, sim, uma contenção. Ele compartilhará o mesmo ambiente do host, mas ele pode sofrer restrições de memória, cpu e disco.

Há diversas ferramentas diferentes que podem ser utilizadas dependendo do tipo de hypervisor que se usa. Um exemplo de hypervisor leve é o LxC e um exemplo do outro tipo é o Kvm.

domingo, 26 de fevereiro de 2017

Sobre o que sera esse blog...

A ideia desse blog é mostrar algumas coisas que acho interessante na parte de informatica ou não. Por exemplo, em uma semana posso revisar conceitos de computação, na outra explicar como configurar alguma ferramenta e etc. Em suma é sobre o que der na telha. =p

Quem quiser ver conteúdo que eu tenho publicados no site vivaolinux pode acessar a url https://www.vivaolinux.com.br/~jllucca e clicar em Contribuições. Faz muito tempo que não acesso o site para fazer alguma contribuição e acredito que a maior parte era de programação na epoca...

teste

teste