Qual é a diferença entre Heap e Stack?

Pergunta originalmente respondida no QUORA em 03/07/2019

Definição de Heap:

Heap é uma árvore binária com chaves em seus nós (uma chave por nó) conforme a seguir:

Ela é essencialmente completa, ou seja, todos os seus níveis são completos menos o último nível, onde somente a chave mais à direita pode eventualmente estar faltando.

*A chave de cada nó pai (acima) é maior ou igual à chave filho (que vem abaixo).

Observe: Os elementos de uma heap são ordenados de cima para baixo (junto com qualquer caminho abaixo de sua raiz), porém eles não são ordenados da esquerda para a direita.

Algumas propriedades de uma heap:

  • Dado n, há uma única árvore binária com n nós que é essencialmente completa com h=[log2n]
  • .
  • A raiz contém o maior valor chave
  • Uma sub árvore extraída de qualquer nó de uma heap também é uma heap
  • Uma heap pode ser representada como um array.

Fonte da definição de uma heap: https://cs.winona.edu/lin/cs440/…


Definição de Stack:

Stack ou pilha é um conjunto ordenado de itens no qual novos itens podem ser inseridos e a partir do qual podem ser eliminados itens um uma extremidade chamada topo da pilha.

Ao contrário do vetor, a definição de pilha abrange a inserção e remoção de itens o que a faz um objeto dinâmico, mutável.

Por definição somente uma extremidade é designada como topo da pilha. Novos itens podem ser adicionados no topo da pilha, consequentemente deslocando o topo da pilha para cima e os itens que estão no topo da pilha podem ser removidos, consequentemente deslocando o topo da pilha para baixo.

O topo da pilha é a extremidade em que os dados são inseridos e retirados da pilha e por essa razão uma pilha também é chamada de LIFO, last in first out, último a entrar, primeiro a sair.

A pilha, computacionalmente, sempre é vista pelo topo, de cima para baixo (somente pode-se observar o topo da pilha), embora para explicar seu funcionamento a pilha seja exibida em perfil.

Para acessar o último elemento de uma pilha é necessário desempilhar os elementos que estiverem por cima do último elemento para poder acessá-lo, conforme imagem abaixo (clique para ampliar).

Fonte da difinição de stack: TENENBAUM, Aaron M.; LANGSAM, Yedidyah; AUGESNSTEIN, Moshe J.. Estruturas de Dados Usando C. São Paulo: Pearson, 2013. 884 p. ISBN 13: 978-85-346-0348-5.

Assim Nelson Zart disse

No começo de minha carreira eu tive o prazer de trabalhar com um técnico de computadores, senior, na antiga Burroughs Eletrônica. Isso foi nos idos de 1985 e muitos de vocês sequer pensavam em nascer kkkk.

Então, ele tinha um bordão que utilizava quando a gente se enrolava em consertar os mainframes que era o seguinte:

“Quando tudo o mais falhar, siga o manual”

Nelson Zart

Pois é. hoje me lembrei dele em dois momentos.

Um deles eu estava configurando o Apache Directory Studio para acessar o LDAP do Google Workspace Enterprise e tive de configurar o Stunnel seguindo o manual e em outro caso, meu colega estava se batendo para fazer o agente GLPI subir o status no servidor do GLPI.

Em ambos os casos, só conseguimos resolver esses problemas após lermos a documentação e proceder com a configuração, conforme indicado nos respectivos manuais.

Nada de fórum, Stack Overflow e adivinhação. Definitivamente foi a leitura do manual que resolveu o perrengue.

Obrigado Nelson!

Como eu faço para que uma impressora sempre pegue o mesmo endereço de IP, mas que a configuração de rede da impressora seja para ela sempre obter dinamicamente um endereço de IP do servidor de DHCP?

Resposta publicada no Quora em 16/10/2021

Fácil.

Se você precisa que um dispositivo de rede sempre obtenha dinamicamente o mesmo endereço de IP cada vez que for ligado, saiba que é possível fazer essa configuração direto no equipamento que fornece o serviço de DHCP.

Utilizar esse tipo de configuração pode ser interessante para impressoras, servidores, centrais telefônicas e demais equipamentos, que se mudarem o endereço de IP, as coisas podem eventualmente vir a parar de funcionar e também serve para evitar que usuários finais fiquem configurando endereços errados nos equipamentos.

Usuário: “Qual é a configuração da impressora?

Técnico: “Deixe o DCHP ON, tudo automático e não me enche o saco”

Técnico anônimo

Para instalações domésticas, normalmente quem fornece o serviço de DHCP é o roteador da casa ou do pequeno escritório.

Como é que faz?

Basta configurar no roteador, que um determinado endereço de IP seja associado com o endereço de MAC Address do equipamento que desejamos fixar seu endereço de IP.

Como exemplo, mostro uma fonte de alimentação que pode ser acessada pela rede, mas o mesmo é válido para outros equipamentos, incluindo impressoras.

O endereço que eu quero fixar para ela é 192.168.2.101

Eu entro nas configurações de rede da fonte de alimentação e procuro pelo endereço de MacAddres do equipamento conforme destacado com a seta.

Note também que o equipamento está configurado com o DHCP on, para sempre pegar o endereço de IP do provedor DHCP, que no caso é o roteador de casa.

Encontrando o Mac Address

Ainda conforme a foto acima, o MacAddress da fonte de alimentação é 00:27:00:00:15:26 e o DHCP ficou ligado, assim a fonte sempre irá se configurar automaticamente.

Configurando o roteador:

No roteador, temos que garantir que o serviço DHCP nunca irá utilizar o endereço que eu quero atribuir para a fonte.

Isso é feito, informando para o servidor DHCP qual é o endereço inicial que ele deve trabalhar.

No meu caso e conforme indicado abaixo, o meu roteador vai fornecer endereços de IP para os equipamentos da casa, a partir do endereço 192.168.2.150. Tudo o que vier abaixo disso, de 192.168.2.1 até 192.168.2.149, embora funcionais, são endereços reservados.

Definindo o endereço de IP inicial. O que vem antes, está reservado.

Conforme dito acima, irei utilizar o endereço 192.168.2.101, que é um endereço que é menor que o endereço inicial, portanto trata-se de um endereço reservado.

O servidor DHCP nunca irá atribuir esse endereço para qualquer equipamento, a menos que isso seja explicitamente indicado.

Toque final:

Para explicitamente indicar ao roteador para quem ele deve atribuir o endereço de IP 192.168.2.101, conforme figura abaixo, basta ir na aba “Reserva de Endereço” e associar o MacAddress da fonte de alimentação 00:27:00:00:15:26, com o endereço de IP 192.168.2.101 que a fonte deve sempre pegar.

Associando o Mac Address com o endereço de IP

Dessa forma o roteador irá saber que o endereço 192.168.2.101 está reservado para o MacAddress 00:27:00:00:15:26 e toda vez a fonte de alimentação for ligada e ela solicitar um endereço de IP na rede, ela sempre irá receber o mesmo endereço de IP.

E dessa forma, eu tenho paz e tranquilidade enquanto saboreio um delicioso sorvete de ouro, na costa do mediterrâneo:

https://pt.quora.com/Em-que-lugar-do-mundo-um-sorvete-custa-70-Euros/answer/W-Klein

Por que se usa tanto o hexadecimal na ciência da computação, quando decimal é mais fácil de entender?

Resposta publicada no Quora em 19/04/2021

Em computação, hexadecimal é muito mais fácil de entender.

Quando um programador que manja de hardware olha para um código hexadecimal, ele sabe exatamente como o hardware está se comportando, apenas fazendo contas de cabeça.

Por isso que o hexadecimal é utilizado.

Não leia o resto.

Modo nerdice on.

Computador trabalha com lógica binária.

Pensando em um computador de 8 bits, sabemos que ele consegue manusear 8 bits por vez em sua linha de dados.

No diagrama abaixo temos um computador simplificado:

  • Do lado esquerdo tem o processador e do lado direito tem a memória. Deixei de fora alguns detalhes para ficar mais fácil a explicação.
  • O processador e a memória são interligados pelo barramento de endereçamento, de dados e as linhas de controle.
  • O barramento de dados está detalhando os 8 bits que o compõe.
  • Cada seta no barramento de dados representa um bit de dados.
  • O processador consegue ler e escrever na memória, 8 bits de dados por vez, pois trata-se de um computador de 8 bits.

Os bits, são essas linhas que podem assumir valores binários de zero ou um.

Eletronicamente falando:

Essas linhas dos bits de dados podem estar energizadas ou não.

As linhas que estiverem energizadas terão o valor lógico VERDADEIRO (1 – um) e as que não estiverem energizadas terão o valor lógico FALSO (0 – zero).

Onde entra o hexadecimal:

Note que o barramento de dados foi separado em dois conjuntos de 4 bits.

  • Um conjunto de 4 bits engloba os bits de 0 a 3
  • O segundo conjunto de 4 bits engloba os bits de 4 a 7

A pergunta que a gente faz agora é: Quantas combinações a gente consegue fazer de bits ligados e desligados aqui?

Já dou a resposta, que são 256 combinações indo de todos os 8 bits com valor FALSO – desligados até termos todos os 8 bits com o valor VERDADEIRO – ligados.

Acompanhe, analisando os 4 primeiros bits:

https://qph.fs.quoracdn.net/main-qimg-85eaffbadd3963c04251e5859084f219

Os caras fizeram o seguinte, os quatro primeiros bits, dá para fazer 16 combinações indo do valor decimal zero até o valor decimal 15. Basta continuar com a tabela adicionando os bits que faltam e iremos chegar em 256 combinações, podendo representar os números de zero a 255..

Mais um detalhe: A posição do bit corresponde a um valor decimal. Se os bits zero e dois forem verdadeiros, significa que temos o número 5 nas notações decimal e hexadecimal, por exemplo.

Conforme dito, se pegar o segundo conjunto de 4 bits, também dá para fazer essas dezesseis combinações.

Juntando o primeiro e o segundo conjunto de 4 bits, dá para fazer 16 X 16 combinações, ou seja, dá para fazer 256 combinações, que é capaz de representar os valores decimais indo de zero a 255.

No fim de tudo é isso o que realmente importa:

Para simplificar isso aí, os bits são separados em grupos de 4 bits que são representados pelos símbolos indo de “0” até “F”.

Um código indicando quais linhas de cada conjunto de 4 bits estão ligadas ou desligadas.

Simples e brilhante.

Desenvolvendo computadores:

Agora, se coloque no lugar do desenvolvedor de computadores.

O cara tem que lidar com o circuito elétrico. Tem que olhar para um código e decodificar de cabeça quais linhas do barramento de dados estão energizadas ou não.

É muito mais fácil para um engenheiro de hardware:

  • Separar a linha de dados em grupos de 4 bits.
  • Trabalhar com a notação hexadecimal, 3A por exemplo.
  • Converter esse número, de cabeça para o binário “0011 1010”.
  • E identificar no barramento quais linhas de dados que estão energizadas ou não…

Do que fazer a conversão do número 58 (decimal) para seu correspondente binário, que é bem mais complicado.

É por isso que se utiliza o hexadecimal.

Hexadecimal é para humanos falarem com máquinas, enquanto que decimal é para máquinas falarem com humanos.

Recomendo que seja lido o livro do Tocci, que já indiquei em outras respostas por aqui.

Fontes:

Livro do Tocci:https://loja.grupoa.com.br/sistemas-digitais-principios-e-aplicacoes-12ed9788543025018-p1005546?tsid=34

Demais tabelas e infográficos: Acervo pessoal.

Como é que o Led acende

Olha, a teoria de como um led acende está escrita por ai, aos montes.

O que eu faço aqui é complementar toda a teoria, mostrando uma sequência de fotos de led, nas cores azul, verde e vermelho, com diferentes voltagens, mostrando o aumento do brilho à medida que aumenta a corrente circulando no mesmo.

O resistor do led vermelho é de 180 ohms e o dos outros leds é 120 ohms e cada “led – resistor” foram alimentados com uma tensão que foi ajustada entre 2 e 3 volts.

As fotos foram tiradas com uma Nikon D3200, lente macro 85mm, focando a objetiva do estereoscópio. Temos, no final, a foto do setup utilizado.

Quando não especificado, foi utilizada abertura f/5.6, tempo de exposição 1/40, ISO 800.

Clique nas fotos para ampliar ou botão direito -> ver imagem.

Divirta-se:

Publicado em 28/03/2021, por Renato de Pierri

Como fazer pudim de Leite Moça?

O que tem a ver uma tradicional receita de pudim e a contagem binária de 8 bits, indo de zero a 255?

Pergunta respondida originalmente no Quora em 25/02/2021

Pudim de 8 bits:

Foto: Acervo pessoal

Ingredientes:

  • 1 lata de leite moça
  • 2 medidas de leite da lata de leite moça.
  • 4 ovos (tire a pele da gema).
  • 8 colheres de sopa, bem cheias de açúcar.

Modo de preparo:

  • Por 16 minutos aqueça o açúcar em uma forma de pudim até formar o caramelo de açúcar. Cuidado para não queimar o açúcar. Espalhe esse caramelo pela forma até ela ficar bem amarelinha.
  • Por no máximo 32 minutos, bata em um liquidificador a 1 medida de leite moça, as 2 medidas de leite e os 4 ovos.
  • Coloque, na forma caramelizada, o conteúdo previamente batido no liquidificador.
  • Asse o pudim em Banho Maria por 64 minutos em um forno pré aquecido a 128°C, assim que colocar a forma no forno, ajuste a temperatura do forno para que fique em torno de 255°C.

Programadores entenderão a receita.

127 e 220Volts, de onde eles vêm?

Esse post veio da seguinte pergunta no Quora:

Os fios de energia tem duas fases de 127V, essas fases estão em sentido opostos? Se não, como eles são somados para formar 220V?

A resposta que vou dar aqui é baseada na energia elétrica que é fornecida em minha residência. Para outras unidades consumidoras, a resposta pode ser diferente, ok?

Olhando a conta de energia elétrica:

Olhando a conta de energia elétrica de minha casa, conforme figura 1 abaixo, podemos ver que o tipo de fornecimento de energia elétrica é monofásico (guarde essa informação).

Figura 1: Conta de energia monofásica.

Com essa informação dá para falar com segurança que a energia elétrica que chega em minha residência é monofásica a 3 fios.

Pera lá e a pergunta:

É exatamente aqui que entra a pergunta do Quora: Como a energia fornecida pode ser monofásica se chegam 3 fios na residência?

Como se a gente medir do neutro para cada uma das supostas fases dá 127Volts e se a gente medir entre as duas supostas fases temos 220Volts?

Que mutreta é essa?

Me explica isso aí que preciso saber 🙂

O transformador no poste:

Como sempre sem entrar em muitos detalhes, podemos dizer que o transformador lá da rua é um monte de fio enrolado de tal maneira que seja possível reduzir a alta tensão da rua para os 220Volts que utilizamos em casa.

A parte do transformador que recebe a alta tensão da rua é chamada de primário do transformador e a parte que entrega os 220V para as residências é chamada de secundário do transformador.

Focando no secundário do transformador.

A grosso modo, podemos dizer que o secundário do transformador, nesse caso, é composto por 3 enrolamentos ligados conforme figura 2 abaixo, que compõem as 3 fases de um sistema trifásico:

Figura 2: Ligação delta do secundário.

Esse diagrama de ligação do secundário do transformador é chamado de ligação delta. Também tem a ligação estrela que não vou abordar nessa resposta.

Note que os enrolamentos do transformador são ligados “no formato” de um triângulo e que temos as seguintes tensões de fases:

  • Tensão de fase 1 entre o ponto A e C, fornecendo 220Volts.
  • Tensão de fase 2 entre o ponto B e C, fornecendo 220Volts.
  • Tensão de fase 3 entre os pontos A e B, fornecendo 220Volts.

Agora as coisas começam a ficar interessantes:

Os fios que saem dos pontos A, B e C se chamam “fase” e muitos técnicos confundem o fio de fase com a tensão de fase que é algo totalmente diferente.

A tensão de fase é medida, nesse caso, entre dois fios de fase. Um fio de fase está saindo do ponto A e o outro fio de fase está saindo do ponto C.

Quando eu meço a voltagem entre os fios de fase que saem do ponto A e C, eu estou medindo apenas uma tensão de fase, que nesse caso é a tensão de fase 1.

Na minha residência não tem como ter as outras 2 tensões de fase porque está faltando o fio de fase que sai do ponto B. Simplesmente não dá para usar as outras duas tensões de fase.

Por isso é que o sistema é monofásico. Ele é monofásico porque está chegando na unidade consumidora apenas uma tensão de fase.

Eu tenho o neutro e 2 fios de fase que me permitem utilizar apenas uma tensão de fase ;-).

Ok, ainda está faltando o neutro. De onde vem o neutro?

Ainda olhando na figura 2, dá para ver que tem um fio saindo do meio do enrolamento do transformador que faz a fase 1. Ele é o neutro.

Abaixo segue o detalhe da fase 1, mostrando a ligação do fio neutro na rua e nos fios que chegam em casa:

Figura 3: A origem do fio neutro

O fio neutro é uma derivação bem no meio do enrolamento do transformador.

Por isso que a voltagem sai meio a meio, mas mesmo assim a tensão não muda de fase.

Explicando melhor:

Digamos que esse enrolamento entre os pontos A e C tenha 220 espiras (voltas).

Podemos dizer que os 220Volts estão distribuídos entre o ponto A e C do enrolamento do transformador.

Como esse enrolamento tem 220 espiras, podemos dizer que cada espira é responsável por fornecer 1 volt.

À medida que vou subindo as espiras, a voltagem vai subindo até eu chegar na última espira e enxergar os 220Volts entre o ponto A e C.

Não há mudança de fase quando eu caminho do ponto A para o ponto C do enrolamento e vou medindo a tensão das espiras, ou vice versa. A tensão medida apenas aumenta ou diminui, mas sempre permanece em fase. Por isso que é monofásico.

Se eu parar na metade do caminho entre A e C e fizer uma derivação naquele ponto e o chamar de neutro, a tensão de saída do neutro para o ponto A ou C será exatamente a metade da tensão entre o ponto A e C.

Aí o que os caras fazem?

  • “Eles” aterram essa derivação central do transformador da rua, justamente aquele fio que sai do meio do enrolamento.
  • Então eles “batizam” de neutro essa derivação central que foi previamente aterrada.
  • Dizem que “não dá choque”,
  • Nos dizem que ele é o ponto de referência para medir tensão
  • E aí a gente mede do meio do enrolamento do transformador para cada uma das pontas e encontra os 110Volts
  • E aí a gente mede entre os pontos A e C e encontra os 220Volts
  • E fica pensando que são duas fases, só que não é isso por conta da maneira que o enrolamento do transformador foi construído.

É só uma bobina com uma derivação central no enrolamento do transformador, cuja derivação central, “por acaso” foi aterrada.

De quebra, temos que dentro da casa, o neutro e terra tem o mesmo ponto de origem.

Enquanto o terra serve para proteger dispositivos elétricos e pessoas, o neutro permite que a residência seja alimentada com uma tensão menor e mais segura.

Note também que o neutro é aterrado tanto no poste como na caixa de medição de energia elétrica e o aterramento dentro da unidade consumidora deve ter uma origem única.

É isso. Espero que tenha conseguido esclarecer essa dúvida.

Fonte:

MARTIGNONI, Alfonso. Transformadores. 8. ed. São Paulo: Globo, 1969. 307 p. (ISBN: 85-250-0223-2).

High-leg delta – Wikipedia

LIG BT 12° edição – 2014

Publicado por Renato de Pierri em 15/02/2021

Pavê dos Padres – Nestlé

Sabe aquela receita de pavê maravilhosa que ninguém conta como é feita?

Pois é… já perdi uma dúzia de vezes, várias delas.

Para não perder de novo, mais uma delas, ela segue abaixo. Afinal nem só de bits e bytes vive o ser humano!

Fonte: escaneado direto da gaveta de receitas de minha casa, antes que ela suma de vez.

Ingredientes:

  • 1 lata de Leita Moça
  • Meia medida de leite
  • 2ovos
  • 1 xícara (chá) de Chocolate em Pó Solúvel Nestlé
  • 4 colheres (sopa) de açúcar
  • 1 lata de Creme de Leite Nestlé
  • 1 xícara (chá) de leite
  • 1 pacote de Biscoito Champagne São Luiz (200g)
  • 100g de Chocolate Meio Amargo Nestlé, picado

Modo de Preparo:

  • Leve ao fogo baixo o Leite Moça com a meia medida do leite, as gemas peneiradas e 3 colheres (sopa) de Chocolate em Pó.
  • Mexa sempre até adquirir consistência cremosa.
  • Bata as claras em neve.
  • Junte o açúcar, batendo sempre até formar um merengue.
  • Adicione levemente o Creme de Leite Nestlé, o Chocolate Meio Amargo picado; faça outra camada de biscoitos e o creme de claras.
  • Leve à geladeira por no mínimo 4 horas.
  • Na hora de servir, peneire o restante do chocolate em pó sobre a superfície.

Rendimento: 6 a 8 porções.

Por que programar não é pra qualquer um?

Responder essa, parece que estão querendo colocar os programadores em um patamar superior. SQN. Programadores precisam se dedicar muito nessa profissão.

A profissão de programador, como um todo, demanda que o profissional seja capaz de desmembrar tarefas complexas em passos menores e facilmente executáveis, utilizando uma linguagem extremamente precisa e que não admite erros.

Programas simples como solicitar que um led acenda ao abrirmos uma porta, demandam uma série de instruções que precisam estar ordenadas na sequência correta e devem ser sintática e semanticamente corretas.

Exemplificando, para o Arduino, um programa desses que acende ou apaga um led a partir do monitoramento de um sensor, seria mais ou menos assim:

#include <Arduino.h>

int ledPortaAberta=8;
int ledPortaFechada=10;
int sensorPorta=6;

#define DESLIGADO LOW
#define LIGADO HIGH

void setup(){
	pinMode(ledPortaAberta, OUTPUT);
	pinMode(ledPortaFechada, OUTPUT);
	pinMode(sensorPorta, INPUT);
	Serial.begin(9600);
}

void loop(){
	
	if (digitalRead(sensorPorta)==LIGADO){
		digitalWrite(ledPortaAberta, DESLIGADO);
		digitalWrite(ledPortaFechada, LIGADO);
		Serial.println("Porta fechada");
	}
	else {
		digitalWrite(ledPortaAberta, LIGADO);
		digitalWrite(ledPortaFechada, DESLIGADO);
		Serial.println("Porta aberta");
	}
	delay(1);
}

Conforme dito, o programa não deve ter nenhum erro sintático, caso contrário ele não ele não irá compilar e muito menos será possível gerar o código executável abaixo:

Ainda assim, não basta saber escrever o programa, colocar os comandos na sequência correta, seguir todas regras da linguagem, saber compilar, gerar esse código hexadecimal e até entender cada um dos comandos hexa acima.

O programa também tem que ser semanticamente correto.

A semântica, o sentido das palavras bem como a interpretação das sentenças e dos enunciados utilizados nessa linguagem acima devem refletir exatamente o que foi solicitado em linguagem natural, “quando uma porta se abre, um led se acende e quanto a mesma porta se fecha, o led tem que apagar”.

O trabalho do programador é converter um requisito em linguagem natural para a linguagem formal.

Esse trabalho de fazer a conversão e garantir que a semântica de ambas linguagens estejam alinhadas é onde está a arte e o desafio que programadores enfrentam todos os dias.

Dá para aprender, mas eu diria que poucos são metódicos o suficiente para tal.

É uma questão de perfil, nada mais.

Resposta originalmente postada no Quora em 29/maio/2020 e fonte da foto do teclado: https://www.cybercentralcorp.com/blog/