Mudanças entre as edições de "Programação para Redes de Computadores (técnico) (diário 2013-1)"

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
 
(10 revisões intermediárias pelo mesmo usuário não estão sendo mostradas)
Linha 341: Linha 341:
  
 
==27/05==
 
==27/05==
Em um passeio na Havan, eis que me deparo com essas formas de pagamento:
+
Formas de pagamento?
 
<syntaxhighlight lang=bash>
 
<syntaxhighlight lang=bash>
 
#!/bin/bash
 
#!/bin/bash
if [ "${2}" = "" ]
+
 
then
+
calcula_parcela()
echo -n "Por favor, informe o valor do produto: "
+
{
read valor
+
if [ "${2}" = "" ]
echo -n "Agora, a quantidade de parcelas: "
+
then
read parcelas
+
echo -n "Por favor, informe o valor do produto: "
else
+
read valor
valor=${1}
+
echo -n "Agora, a quantidade de parcelas: "
parcelas=${2}
+
read parcelas
fi
+
else
if [ "${parcelas}" = "1" ]
+
valor=${1}
then
+
parcelas=${2}
echo Valor final: $(echo "scale=2; ${valor} * 0.9"|bc)
+
fi
fi
+
if [ "${parcelas}" = "1" ]
if [ "${parcelas}" -ge "2" -a "${parcelas}" -le "3" ]
+
then
then
+
echo Valor final: $(echo "scale=2; ${valor} * 0.9"|bc)
echo Valores: 1 + $(echo "${parcelas} - 1"|bc) de $(echo "scale=2; ${valor}/${parcelas}"|bc)
+
fi
fi
+
if [ "${parcelas}" -ge "2" -a "${parcelas}" -le "3" ]
if [ "${parcelas}" -ge "4" -a "${parcelas}" -le "36" ]
+
then
then
+
echo Valores: 1 + $(echo "${parcelas} - 1"|bc) de $(echo "scale=2;${valor}/${parcelas}"|bc)
somatorio="0"
+
fi
parcelaCorrente=$(echo "scale=2; ${valor} / ${parcelas}"|bc)
+
if [ "${parcelas}" -ge "4" -a "${parcelas}" -le "36" ]
for mes in $(seq 1 ${parcelas})
+
then
do
+
somatorio="0"
parcelaCorrente=$(echo "scale=2; ${parcelaCorrente} * 1.0215"|bc)
+
parcelaCorrente=$(echo "scale=2; ${valor} / ${parcelas}"|bc)
somatorio=$(echo "scale=2; ${somatorio} + ${parcelaCorrente}"|bc)
+
for mes in $(seq 1 ${parcelas})
echo "[${mes}: ${parcelaCorrente} - ${somatorio}]"
+
do
done
+
parcelaCorrente=$(echo "scale=2; ${parcelaCorrente} * 1.0215"|bc)
echo Parcela média é $(echo "scale=2; ${somatorio} / ${parcelas}"|bc)
+
somatorio=$(echo "scale=2; ${somatorio} + ${parcelaCorrente}"|bc)
fi
+
echo "[${mes}: ${parcelaCorrente} - ${somatorio}]"
 +
done
 +
echo Parcela média é $(echo "scale=2; ${somatorio} / ${parcelas}"|bc)
 +
fi
 +
}
 +
 
 +
calcula_parcela ${1} ${2}
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
 +
==03/06==
 +
* Arquivo variaveis:
 +
<syntaxhighlight lang=bash>
 +
DOMINIO="tecnico.sj.ifsc.edu.br"
 +
REDE_PREFIXO="192.168.1"
 +
REDE="${REDE_PREFIXO}.0"
 +
MASCARA="255.255.255.0"
 +
ROTA_PADRAO="${REDE_PREFIXO}.1"
 +
 +
SERVIDOR1_NOME="mestre"
 +
SERVIDOR1_IP="${REDE_PREFIXO}.100"
 +
</syntaxhighlight>
 +
 +
Arquivo configurador:
 +
<syntaxhighlight lang=bash>
 +
#!/bin/bash
 +
 +
. variaveis
 +
 +
interfaces(){
 +
echo "auto lo"
 +
echo "iface lo inet loopback"
 +
echo "auto eth0"
 +
echo "iface eth0 inet static"
 +
echo "    address ${SERVIDOR1_IP}"
 +
echo "    netmask ${MASCARA}"
 +
echo "    gateway ${ROTA_PADRAO}"
 +
}
 +
postfix(){
 +
echo "myhostname=${SERVIDOR1_NOME}"
 +
echo "mydomain=${DOMINIO}"
 +
echo "myorigin=${DOMINIO}"
 +
echo "mynetworks=${REDE}/${MASCARA}"
 +
echo "mydestination=localhost, ${SERVIDOR1_NOME}, ${SERVIDOR1_NOME}.${DOMINIO}, ${DOMINIO}"
 +
}
 +
bind9(){
 +
echo ""
 +
}
 +
 +
echo "Configuração da rede: deseja apresentar na tela ou escrever no arquivo?"
 +
echo "1) Tela"
 +
echo "2) Arquivo"
 +
read opcao
 +
case ${opcao} in
 +
"1")
 +
interfaces
 +
postfix
 +
;;
 +
"2")
 +
interfaces > /etc/network/interfaces
 +
postfix > /etc/postfix/main.cf
 +
;;
 +
*)
 +
echo "Querido, escolha uma opção válida."
 +
;;
 +
esac
 +
</syntaxhighlight>
 +
 +
==10/06==
 +
* Expansão dos serviços com DHCP. Arquivo <tt>variaveis</tt>:
 +
<syntaxhighlight lang=bash>
 +
DOMINIO="tecnico.sj.ifsc.edu.br"
 +
REDE_PREFIXO="192.168.1"
 +
REDE="${REDE_PREFIXO}.0"
 +
MASCARA="255.255.255.0"
 +
BROADCAST="${REDE_PREFIXO}.255"
 +
ROTA_PADRAO="${REDE_PREFIXO}.1"
 +
 +
SERVIDOR1_NOME="mestre"
 +
SERVIDOR1_IP="${REDE_PREFIXO}.100"
 +
 +
DHCP_INICIO="50"
 +
DHCP_FIM="99"
 +
</syntaxhighlight>
 +
 +
* Arquivo <tt>configurador</tt>:
 +
<syntaxhighlight lang=bash>
 +
#!/bin/bash
 +
 +
. variaveis
 +
 +
interfaces(){
 +
echo "auto lo"
 +
echo "iface lo inet loopback"
 +
echo "auto eth0"
 +
echo "iface eth0 inet static"
 +
echo "    address ${SERVIDOR1_IP}"
 +
echo "    netmask ${MASCARA}"
 +
echo "    gateway ${ROTA_PADRAO}"
 +
}
 +
postfix(){
 +
echo "myhostname=${SERVIDOR1_NOME}"
 +
echo "mydomain=${DOMINIO}"
 +
echo "myorigin=${DOMINIO}"
 +
echo "mynetworks=${REDE}/${MASCARA}"
 +
echo "mydestination=localhost, ${SERVIDOR1_NOME}, ${SERVIDOR1_NOME}.${DOMINIO}, ${DOMINIO}"
 +
}
 +
bind9(){
 +
echo ""
 +
}
 +
dhcp(){
 +
echo "subnet ${REDE} netmask ${MASCARA} {"
 +
echo " range ${REDE_PREFIXO}.${DHCP_INICIO} ${REDE_PREFIXO}.${DHCP_FIM};"
 +
echo " option subnet-mask ${MASCARA};"
 +
echo " option broadcast-address ${BROADCAST};"
 +
echo " option routers ${ROTA_PADRAO};"
 +
echo " option domain-name-servers ${ROTA_PADRAO};"
 +
echo " option domain-name ${DOMINIO};"
 +
echo " default-lease-time 3600;"
 +
echo " max-lease-time 14400;"
 +
echo "}"
 +
}
 +
 +
echo "Configuração da rede: deseja apresentar na tela ou escrever no arquivo?"
 +
echo "1) Tela"
 +
echo "2) Arquivo"
 +
read opcao
 +
case ${opcao} in
 +
"1")
 +
interfaces
 +
postfix
 +
dhcp
 +
;;
 +
"2")
 +
interfaces > /etc/network/interfaces
 +
postfix > /etc/postfix/main.cf
 +
dhcp > /etc/dhcp/dhcpd.conf
 +
;;
 +
*)
 +
echo "Escolha uma opção válida."
 +
;;
 +
esac
 +
</syntaxhighlight>
 +
 +
==17/06==
 +
* Para esta aula, um problema interessante a resolver para a configuração de DNS: se a rede for classe cheia (''classful network'', A, B ou C), deve-se configurar também a zona reversa, caso contrário (''classless network'') emitir apenas um alerta de que se trata de CIDR.
  
 
=Avaliação=
 
=Avaliação=
 
* [https://docs.google.com/spreadsheet/ccc?key=0AvKQkavuEKVtdDdPdVB4MlhNT0o1ME1uY2o2WnROSWc&usp=sharing Conceitos]
 
* [https://docs.google.com/spreadsheet/ccc?key=0AvKQkavuEKVtdDdPdVB4MlhNT0o1ME1uY2o2WnROSWc&usp=sharing Conceitos]

Edição atual tal como às 19h46min de 17 de junho de 2013

Aulas

01/04

Problema: saber o valor final de parcelamento (1 +3) a 2% de juros.

inicio

// Problema: pagamento de uma geladeira, comprada a prazo em
// 1 + 3 x com juros de 2% ao mês.
escrever "Por favor, informe o valor da geladeira: "
real valorGeladeira
ler valorGeladeira

// 1) Saber quanto é o valor de entrada.
escrever "Agora, informe o valor da entrada: "
real entrada
ler entrada

// 2) Deduzir o valor de entrada do valor total, e depois dividir por 3. Isso 
//    dará o valor da parcela sem juro. Aplicar, no segundo mês, já o juro de 2%.
real parcela
parcela <- (((valorGeladeira - entrada) / 3) * 1.02)

// 3) No terceiro mês, aplicar o mesmo juro sobre o valor do mês anterior;
//    ou seja, juro composto.
real parcela2
parcela2 <- (parcela * 1.02)

// 4) Repetir o processo no quarto mês.
real parcela3
parcela3 <- (parcela2 * 1.02)

// 5) Somar tudo e ver o prejuízo.
real somatorio
somatorio <- entrada + parcela + parcela2 + parcela3
escrever "Ao final, a geladeira custou ", somatorio, "."

fim

08/04

E se todas as opções forem variáveis?

inicio

escrever "Por favor, informe o valor da geladeira: "
real valorGeladeira
ler valorGeladeira

escrever "Deseja pagar a entrada? S ou N"
texto pagarEntrada
ler pagarEntrada

real entrada
se (pagarEntrada = "N" ou pagarEntrada = "n") entao 
    entrada<-0
senao 
    escrever "Agora, informe o valor da entrada: "
    ler entrada
fimse 

escrever "Valor de juros: "
real valorJuros
ler valorJuros

escrever "Quantidade de parcelas: "
real qtdParcelas
ler qtdParcelas

real somatorio
real parcela
parcela <- (valorGeladeira - entrada) / qtdParcelas

inteiro mes
para mes de 1 ate qtdParcelas passo 1
    parcela <- parcela * (1 + valorJuros * 0.01)
    somatorio <- somatorio + parcela
proximo 

escrever "Ao final, a geladeira custou ", entrada + somatorio, "."
escrever "\nForam ", qtdParcelas, " parcelas de ", somatorio / qtdParcelas, " cada."

fim

15/04

Problema do dia: Dado um dia e mês neste ano de 2013, em que semana estamos?

inicio

inteiro dias
inteiro mês
inteiro semanas
inteiro resto
inteiro quociente

//Pedir ao usuário:
//- dia
//- mês
escrever "Informe o dia: "
ler dias
escrever "Agora, informe o mês (número): "
ler mês

//Dependendo do mês, deve-se somar à quantidade de dias, de acordo com o calendário juliano.
//Ao final, teremos a quantidade de dias no ano.
escolhe mês
    caso 1: // Janeiro
        dias <- dias
    caso 2: // Fevereiro
        dias <- dias + 31
    caso 3: // Março
        dias <- dias + 31 + 28
    caso 4: // Abril
        dias <- dias + 31 + 28 + 31
    caso 5: // Maio
        dias <- dias + 31 + 28 + 31 + 30
    caso 6: // Junho
        dias <- dias + 31 + 28 + 31 + 30 + 31
    caso 7: // Julho
        dias <- dias + 31 + 28 + 31 + 30 + 31 + 30
    caso 8: // Agosto
        dias <- dias + 31 + 28 + 31 + 30 + 31 + 30 + 31
    caso 9: // Setembro
        dias <- dias + 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31
    caso 10: // Outubro
        dias <- dias + 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30
    caso 11: // Novembro
        dias <- dias + 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31
    caso 12: // Dezembro
        dias <- dias + 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30
fimEscolhe        

//Como a primeira semana tem apenas 5 dias (começa na terça), se a soma estiver entre 1 e 5 então
// estamos ainda na primeira semana. Caso contrário, apenas subtraimos esse valor (5) da soma.
se dias >=1 e dias <= 5 então
    semanas <- 1
senão
    dias <- dias - 5
    //Com o valor que sobrou, faz-se uma divisão por 7. Se o resto for 0, o resultado é o próprio
    // quociente mais um (a primeira semana); caso contrário (o resto está entre 1 e 6), então
    // somamos: primeira semana (1) + quociente + 1 semana.
    resto <- dias % 7
    se resto = 0 então
        semanas <- (dias / 7) + 1
    senão
        semanas <- 1 + (dias / 7) + 1
    fimSe
fimSe

escrever "É a semana número ", semanas, "."

fim

22/04

O clássico problema: um número é primo quando...?

inicio

// Declaração de variáveis.
inteiro número
inteiro divisor
inteiro resto
inteiro divisores

// Interação com o usuário: número a ser testado como primo.
escrever "Por favor, digite um número inteiro entre 1 e 10000: "
ler número

// Como 1 e o próprio número sempre serão divisores, interessa saber se os valores
// intermediários conseguem dividir, com resto inteiro, o número solicitado.
divisor <- 2
divisores <- 0
enquanto divisor < número faz
    resto <- número % divisor
    se resto = 0 então
        escrever "[", divisor, "]"
        divisores <- divisores + divisor
    senão
        escrever "."
    fimSe
    divisor <- divisor + 1
fimEnquanto

se divisores = 0 então
    escrever "\nO número ", número, " é primo."
senão
    escrever "\nO número ", número, " NÃO é primo."
fimSe

fim

Ou mais características: se é primo, se é perfeito e sua soma cabalística (soma dos algarismos até resultar em um único dígito):

inicio

inteiro número
inteiro divisores
inteiro divisor
inteiro resto
inteiro centena
inteiro dezena
inteiro unidade
inteiro algarismos

para número de 1 até 999 passo 1
    escrever "[",número
    
    divisores <- 0
    divisor <- 1
    enquanto divisor <= (número / 2) faz
        resto <- número % divisor
        se resto = 0 então
            divisores <- divisores + divisor
        fimSe
        divisor <- divisor + 1
    fimEnquanto
    se divisores = 1 então
        escrever "p"
    senão
        escrever "."
    fimSe
    se divisores = número então
        escrever "P"
    senão
        escrever "."
    fimSe
    
    centena <- número / 100
    dezena <- (número % 100) / 10
    unidade <- número % 10
    algarismos <- centena + dezena + unidade
    se algarismos > 9 então
        dezena <- algarismos / 10
        unidade <- algarismos % 10
    fimSe
    se algarismos > 9 então
        dezena <- algarismos / 10
        unidade <- algarismos % 10
    fimSe
    algarismos <- dezena + unidade
    escrever algarismos,"]"

    escrever " - "
próximo

fim

29/04

  • Primeiro dia de shell script com bash. Primeiro código de exemplo: caixa decorativa:
#!/bin/bash

linha_de_hifens(){
    echo -n "·"
    for caracter in $(seq 1 ${1})
    do  
        echo -n "-"
    done
    echo "·"
}

# Pedir ao usuário que digite um texto.
echo -n "Por favor, digite um texto singelo: "
read texto

# Calcula a quantidade de hífens nas linhas superior e inferior
HIFENS=$(expr $(echo -n ${texto} | wc -c) + 2)

# Escrever o resultado final
linha_de_hifens ${HIFENS}
echo "| ${texto} |"
linha_de_hifens ${HIFENS}

06/05

Um primeiro programa em shell script: criar usuário (e grupo).

#!/bin/bash

# Entrada
# - Criar usuário:
#   - Nome completo
echo -n "Por favor, digite o nome completo do usuário: "
read nomeCompleto
#   - Nome da conta
nomeDaConta=""
while [ "${nomeDaConta}" = "" ]
do
	echo -n "Agora, digite o nome da conta: "
	read nomeDaConta
	REPETIDOS=$(cat /etc/passwd|cut -d : -f 1|grep ^${nomeDaConta}$|wc -l)
	if [ "${REPETIDOS}" -ge "1" ]
	then
		echo "Usuário já existe. Tente novamente."
		nomeDaConta=""
	fi
done
#   - Grupo
grupo=""
while [ "${grupo}" = "" ]
do
	echo -n "Digite o nome do grupo principal: "
	read grupo
done
#   - Interpretador (shell script)
echo -n "Agora, digite o interpretador de comandos: "
read interpretador
#   - Senha
#
# Processamento
# - Criar grupo, se necessário
groupadd ${grupo}
# - Criar usuário com os valores pessoais e incluir o usuário no grupo
useradd -g ${grupo} -c "${nomeCompleto}" -s ${interpretador} \
        -d /home/${grupo}/${nomeDaConta} ${nomeDaConta}
passwd ${nomeDaConta}
# - Criar diretório pessoal
mkdir -p /home/${grupo}/${nomeDaConta}
# - Atribuir as propriedade e permissões do diretório
chown root /home
chgrp root /home
chmod 755  /home
chown root     /home/${grupo}
chgrp ${grupo} /home/${grupo}
chmod 750      /home/${grupo}
chown ${nomeDaConta} /home/${grupo}/${nomeDaConta}
chgrp ${grupo}       /home/${grupo}/${nomeDaConta}
chmod 700            /home/${grupo}/${nomeDaConta}
# 
# Saída
# - Mostrar o grupo criado E mostrar o usuário criado
echo "Informações da conta (incluindo grupo):"
id ${nomeDaConta}
# - Mostrar o diretório criado com as permissões
echo "Propriedade e permissões dos arquivos e diretórios:"
ls -la /home/${grupo}

27/05

Formas de pagamento?

#!/bin/bash

calcula_parcela()
{
	if [ "${2}" = "" ]
	then
		echo -n "Por favor, informe o valor do produto: "
		read valor
		echo -n "Agora, a quantidade de parcelas: "
		read parcelas
	else
		valor=${1}
		parcelas=${2}
	fi
	if [ "${parcelas}" = "1" ]
	then
		echo Valor final: $(echo "scale=2; ${valor} * 0.9"|bc)
	fi
	if [ "${parcelas}" -ge "2" -a "${parcelas}" -le "3" ]
	then
		echo Valores: 1 + $(echo "${parcelas} - 1"|bc) de $(echo "scale=2;${valor}/${parcelas}"|bc)
	fi
	if [ "${parcelas}" -ge "4" -a "${parcelas}" -le "36" ]
	then
		somatorio="0"
		parcelaCorrente=$(echo "scale=2; ${valor} / ${parcelas}"|bc)
		for mes in $(seq 1 ${parcelas})
		do
			parcelaCorrente=$(echo "scale=2; ${parcelaCorrente} * 1.0215"|bc)
			somatorio=$(echo "scale=2; ${somatorio} + ${parcelaCorrente}"|bc)
			echo "[${mes}: ${parcelaCorrente} - ${somatorio}]"
		done
		echo Parcela média é $(echo "scale=2; ${somatorio} / ${parcelas}"|bc)
	fi
}

calcula_parcela ${1} ${2}

03/06

  • Arquivo variaveis:
DOMINIO="tecnico.sj.ifsc.edu.br"
REDE_PREFIXO="192.168.1"
REDE="${REDE_PREFIXO}.0"
MASCARA="255.255.255.0"
ROTA_PADRAO="${REDE_PREFIXO}.1"

SERVIDOR1_NOME="mestre"
SERVIDOR1_IP="${REDE_PREFIXO}.100"

Arquivo configurador:

#!/bin/bash

. variaveis

interfaces(){
	echo "auto lo"
	echo "iface lo inet loopback"
	echo "auto eth0"
	echo "iface eth0 inet static"
	echo "    address ${SERVIDOR1_IP}"
	echo "    netmask ${MASCARA}"
	echo "    gateway ${ROTA_PADRAO}"
}
postfix(){
	echo "myhostname=${SERVIDOR1_NOME}"
	echo "mydomain=${DOMINIO}"
	echo "myorigin=${DOMINIO}"
	echo "mynetworks=${REDE}/${MASCARA}"
	echo "mydestination=localhost, ${SERVIDOR1_NOME}, ${SERVIDOR1_NOME}.${DOMINIO}, ${DOMINIO}"
}
bind9(){
	echo ""
}

echo "Configuração da rede: deseja apresentar na tela ou escrever no arquivo?"
echo "1) Tela"
echo "2) Arquivo"
read opcao
case ${opcao} in
	"1")
		interfaces
		postfix
		;;
	"2")
		interfaces > /etc/network/interfaces
		postfix > /etc/postfix/main.cf
		;;
	*)
		echo "Querido, escolha uma opção válida."
		;;
esac

10/06

  • Expansão dos serviços com DHCP. Arquivo variaveis:
DOMINIO="tecnico.sj.ifsc.edu.br"
REDE_PREFIXO="192.168.1"
REDE="${REDE_PREFIXO}.0"
MASCARA="255.255.255.0"
BROADCAST="${REDE_PREFIXO}.255"
ROTA_PADRAO="${REDE_PREFIXO}.1"

SERVIDOR1_NOME="mestre"
SERVIDOR1_IP="${REDE_PREFIXO}.100"

DHCP_INICIO="50"
DHCP_FIM="99"
  • Arquivo configurador:
#!/bin/bash

. variaveis

interfaces(){
	echo "auto lo"
	echo "iface lo inet loopback"
	echo "auto eth0"
	echo "iface eth0 inet static"
	echo "    address ${SERVIDOR1_IP}"
	echo "    netmask ${MASCARA}"
	echo "    gateway ${ROTA_PADRAO}"
}
postfix(){
	echo "myhostname=${SERVIDOR1_NOME}"
	echo "mydomain=${DOMINIO}"
	echo "myorigin=${DOMINIO}"
	echo "mynetworks=${REDE}/${MASCARA}"
	echo "mydestination=localhost, ${SERVIDOR1_NOME}, ${SERVIDOR1_NOME}.${DOMINIO}, ${DOMINIO}"
}
bind9(){
	echo ""
}
dhcp(){
	echo "subnet ${REDE} netmask ${MASCARA} {"
	echo " range ${REDE_PREFIXO}.${DHCP_INICIO} ${REDE_PREFIXO}.${DHCP_FIM};"
	echo " option subnet-mask ${MASCARA};"
	echo " option broadcast-address ${BROADCAST};"
	echo " option routers ${ROTA_PADRAO};"
	echo " option domain-name-servers ${ROTA_PADRAO};"
	echo " option domain-name ${DOMINIO};"
	echo " default-lease-time 3600;"
	echo " max-lease-time 14400;"
	echo "}"
}

echo "Configuração da rede: deseja apresentar na tela ou escrever no arquivo?"
echo "1) Tela"
echo "2) Arquivo"
read opcao
case ${opcao} in
	"1")
		interfaces
		postfix
		dhcp
		;;
	"2")
		interfaces > /etc/network/interfaces
		postfix > /etc/postfix/main.cf
		dhcp > /etc/dhcp/dhcpd.conf
		;;
	*)
		echo "Escolha uma opção válida."
		;;
esac

17/06

  • Para esta aula, um problema interessante a resolver para a configuração de DNS: se a rede for classe cheia (classful network, A, B ou C), deve-se configurar também a zona reversa, caso contrário (classless network) emitir apenas um alerta de que se trata de CIDR.

Avaliação