Firefox Download Day

June 12th, 2008

Download Day 2008

E se o se deixasse de ser se e virasse outra coisa, mas ainda se?

April 1st, 2008

Seguindo com os malabares em shell, gostaria de mostrar uma nova forma de fazer o “if”… na verdade, o comando “test” pode substituí-lo e gerar uma sintaxe mais enxuta, porém mais dificil de compreender.

Mas, vamos lá: O comando test funciona assim:

# test 1 = 1
# echo $?
0

Perceberam? Ele testou se 1 era igual a 1. Caso seja verdade, a variável “?” (que recebe os codigos de erro) recebe o valor “0″. Ou seja, 1 é igual a 1! Nossa!
Observe a execução abaixo:

# test 1 = 2
# echo $?
1

No caso acima, o código de erro é 1. Dessa forma (e só assim ;) ) podemos concluir que 1 e 2 são diferentes!

Viram algo de surpreendente? Nem eu!

O comando test pode ser substituído por [], ficando assim:

# [ 1 = 1 ]
# echo $?
0

Igualzinho, neh mesmo!?!

O que faz do comando test uma grande ferramenta é o fato de ele suportar operadores lógicos. E o shell, do alto de sua inteligência, atua da seguinte forma: No caso de um “and(&&)”, a segunda expressão só é testada caso a primeira seja verdadeira, caso contrário, pra que disperdiçar processamento com uma causa perdida? Já no caso do “ou(||)”, se a primeira for verdadeira o comando já é um sucesso, pois apenas uma precisa ser verdade.

E como usar isso pra fazer um condicional? É só executar comandos ao invéz de testar expressões, mas isso só após alguma expressão ser testada.

Lá vái:

# [ 1 = 1 ] &&  echo "os dois numeros são iguais"
os dois numeros são iguais

O comando test (representado pelos colchetes) testou se 1 era igual a 1. Como essa expressão era verdadeira, ele precisou executar  a próxima expressão depois do and (&&).Na verdade, depois do and não coloquei uma expressão, enganei o shell colocando um comando pra ser executado. Repare que esse comando só seria executado caso a primeira expressão fosse verdade, por razões já explicadas.

E se a expressão fosse falsa, como ele avisaria? Simples, basta colocar um “ou(||)” depois de tudo. Se o shell descobrir que a primeira expressão é falsa, não executará a segunda, pois trata-se de um “and”, mas será obrigado a verificar se a terceira é verdadeira, pois o “ou” o obriga a isso. Assim, mandamos mais um comando, dessa vez com o erro:

# [ 1 = 2 ] &&  echo "são iguais" || echo "sao diferentes"
são diferentes

Pronto!

Uma última observação: Se eu quiser executar mais de um comando depois de testar a expressão? Use funções, oras!

Lá vai um exemplo:

#!/bin/bash

# INICIO DO SCRIPT
FuncaoSucesso()
{
echo Os numeros sao iguais!
echo Deu tudo certo!
echo Sei lá, execute o que quiser!
}

FuncaoErro()
{
echo Os numeros sao diferentes!
echo Deu tudo errado!
echo Putz!
}

[ 1 = 2 ] && FuncaoSucesso || FuncaoErro

#FIM

Agora, use e abuse das variáveis ;)

Desafio “for”

April 1st, 2008

Estou ministrando uma disciplina de Sistemas Operacionais II, no curso de Sistemas de Informação. Em sala, ofereci um ponto extra pra quem resolvesse um desafio “for”. Aqui no blog, reproduzo o desafio, mas dessa vez valendo só a briga :)

No shell, o for pode ser implementado de algumas formas diferentes. Estou interessado em saber qual das duas implementações abaixo e mais rápida. E por que, obviamente.

for i in $(seq 10); do; <comando_1>; …; <comando_n>; done

ou

for ((i=1; i<=10; i++));  do; <comando_1>; …; <comando_n>; done

Semana Santa

March 26th, 2008

Nessa Semana Santa senti novamente uma curiosidade a respeito da origem das datas. Resolvi estudar um pouco (após vários anos resistindo) e achei algumas coisas interessantes:

1 - Qual o significado da Páscoa?

Pessach (Passagem) é o nome do sacrifício executado em 14 de Nissan, segundo o calendário judáico e que precede a Festa dos Pães Ázimos. Geralmente o nome Pessach é associado a festa que comemora a libertação do povo de Israel do Egito. Isso ocorreu por volta 1440 a.c.
Ou seja, a Pascoa é uma data importante para os Judeus antes mesmo de Jesus ter vindo a terra.
O termo passagem não é referencia a passagem dos hebreus pelo mar vermelho, mas sim a passagem do Anjo da Morte, que foi enviado por Deus e feriu de morte todos os primogênitos egípcios, desde animais até os primogênitos do Faraó.

2 - Já que a Páscoa é uma celebração originalmente judáica, por que existe a Páscoa Cristã?

A Páscoa e o Pessach são eventos diferentes que não devem ser confundidos. Assumir o nome de Páscoa, que seria a tradução original de Pessach, para os eventos da Páscoa Cristã, é algo razoavelmente confuso, que pode ter sido feito intencionalmente com a finalidade de substituir um grande evento da religião judaica por outro grande evento da religião católica.
O sumo-sacerdote encontrava-se preocupado. As autoridades judaicas queriam eliminar Jesus. Deveriam agir antes que ele saísse da cidade e antes da festa da páscoa. Deveriam agir o mais rápido possível. Em seu encontro, uma ajuda veio de uma fonte inesperada - Judas. Por trinta moedas de prata, aceitou trair Jesus. Ficaram muito satisfeitos, seria muito mais fácil prender Jesus agora de forma mais rápida.
O que acontece é que a morte de Cristo acontece em 14 de Nissan, dia do início de Pessach.

3 - E como saber a data da Páscoa Cristã?
Em 325 d.c., a data da Páscoa Cristã foi fixada no Primeiro Concílio de Nicéia, como sendo o primeiro domingo após a primeira lua cheia depois do equinócio de outono no hemisfério sul (ou de primavera, no hemisfério norte).
Fácil não?

4 - E o que danado é equinócio?
(Astronomia) Resumindo, são as duas ocasiões do ano em que o dia e a noite tem durações iguais.
No hemisfério norte o equinócio da primavera ocorre no dia 20 de março, e o equinócio de outono ocorre no dia 23 de setembro. Estas datas marcam o início das respectivas estações do ano neste hemisfério.
No hemisfério sul é o contrário, o equinócio da primavera ocorre no dia dia 23 de setembro, e o equinócio de outono ocorre no 20 de março. Estas datas marcam igualmente o início das respectivas estações do ano neste hemisfério.
Pra nós, que estamos no Hemisfério Sul e queremos calcular a data da Páscoa, interessa o Equinócio de outono (20 de março).
Calculando:
Equinócio de outono no hemisfério sul: 20 de março, em 2008 cai numa quinta.
Primeira lua cheia após equinócio (em 2008): Sexta, 21 de março (veja http://kalender-365.de/calendario-lunar-pt.php)
Primeiro domingo após primeira lua cheia: Domingo, 23 de março. OPA! Finalmente! Esse é o dia da Páscoa Cristã em 2008.

5 - E o carnaval? O que tem haver com tudo isso? Por que a data do Carnaval depende da Páscoa?

A festa carnavalesca surge a partir da implantação, no século XI, da Semana Santa pela Igreja Católica, antecedida por quarenta dias de jejum, a Quaresma. Esse longo período de privações acabaria por incentivar a reunião de diversas festividades nos dias que antecediam a Quarta-feira de Cinzas, o primeiro dia da Quaresma. A palavra “carnaval” está, desse modo, relacionada com a idéia de “afastamento” dos prazeres da carne marcado pela expressão “carne vale”, que, acabou por formar a palavra “carnaval”. No período do Renascimento as festas que aconteciam nos dias de carnaval incorporaram os baile de máscaras, com suas ricas fantasias e os carros alegóricos. Ao caráter de festa popular e desorganizada juntaram-se outros tipos de comemoração e progressivamente a festa foi tomando o formato atual.
Em 1545, no Concílio de Trento, que o Carnaval é reconhecido como uma manifestação popular de rua. Em 1582, o Papa Gregório XIII transforma o Calendário Juliano em Gregoriano e estabelece as datas do Carnaval. O motivo da mobilidade da data é não coincidir com a Páscoa Católica, que não pode ter data fixa para não coincidir com a Páscoa dos judeus.
Dessa forma, o carnaval é comemorado na terça-feira que antecede a quarta-feira de cinzas, que por sua vez é o dia que marca o início da quaresma.

6 - Sim, mas o que é a quaresma?

A Quaresma é o tempo de celebração religiosa de conversão que a Igreja Católica, a Igreja Anglicana e algumas protestantes marcam para preparar os crentes para a grande festa da Páscoa. Durante este período, os seus fiéis são convidados a um período de penitência e meditação, por meio da prática do jejum, da esmola e da oração.
Esse longo período de privações acabaria por incentivar a reunião de diversas festividades nos dias que antecediam a Quarta-feira de Cinzas, o primeiro dia da Quaresma.

Bom, ainda não achamos a data do Carnaval, não é mesmo?
Então lá vai:
A Quaresma dura 47 dias, embora para o calendário litúrgico os domingos não contem, contando então 40 dias.
Dessa forma, pegue o Domingo de Páscoa, volte 40 dias sem contar os domingos e chegaremos na quarta-feira de cinzas. Um dia antes é o carnaval!

6 - Se o carnaval é na terça-feira, por que começa no sábado?
Sábado? Bom, em muitos lugares o carnaval já dura mais de 1 mês.

Espero ter ajudado a entender (ou confundir) um pouco mais sobre essas datas tão importantes para a nossa história.

Direitos Humanos

December 3rd, 2007

Artigo 19°

Todo o indivíduo tem direito à liberdade de opinião e de expressão, o que implica o direito de não ser inquietado pelas suas opiniões e o de procurar, receber e difundir, sem consideração de fronteiras, informações e idéias por qualquer meio de expressão.

Teste na Rede - Parte II: nttcp

November 2nd, 2007

Continuando nosso problema de testar a rede, falo agora um pouco da ferramenta nttcp.

O nttcp (New Test TCP Program) é um programa que mede a taxa de transferência e alguns outros parâmetros em TCP, UDP e UDP Multicast. Ao que me parece, é um programa que pode atender nossos requisitos (ver Teste na Rede ).

Instalando o nttcp:

No servidor (Debian, claro) adicione o repositório “non-free” no ftp.debian.org. Atualize.

# vi /etc/apt/sources.list
deb http://ftp.debian.org/debian stable main non-free
deb-src http://ftp.debian.org/debian stable main non-free

# apt-get update
# apt-get install nttcp

Pronto. Instalado

Agora, vamos iniciar o servidor:

# nttcp -i -p 5432

Esse comando inicia o daemon nttcp na porta 5432 (a mesma do PostgrSQL)sem usar o inetd. Verificando no netstat:

# netstat -anp | grep 5432
tcp  0  0 0.0.0.0:5432  0.0.0.0:*  OUÇA  19156/nttcp

Agora, lá na máquina do cliente, executamos:

# nttcp -T -p 5432 -n 100000 -l 1024 192.168.0.10
Bytes     Real CPU  MBit/s
102400000 348 194 2.357
102400000 348 153 2.356

Esse teste mostra que enviei 100000 pacotes (-n 100000) cada um com 1KB (-l 1024), ou seja, 100MB. Esses dados foram transferidos a 2.35 Mbits por segundo. Demorando 348 segundos. Isso tudo feito na porta 5432, certo? Errado! Vejamos esse tráfego com o tcpdump:

[1] 192.168.0.20.2433 > 192.168.0.10.5432
[2] 192.168.0.10.5432 > 192.168.0.20.2433
[3] 192.168.0.20.2433 > 192.168.0.10.5432
[4] 192.168.0.20.2433 > 192.168.0.10.5432
[5] 192.168.0.10.5432 > 192.168.0.20.2433
[6] 192.168.0.10.5432 > 192.168.0.20.2433
[7] 192.168.0.20.2433 > 192.168.0.10.5432
[8] 192.168.0.20.1945 > 192.168.0.10.5038
[9] 192.168.0.10.5038 > 192.168.0.20.1945
[10] 192.168.0.20.1945 > 192.168.0.10.5038
[11] 192.168.0.20.1945 > 192.168.0.10.5038

Linha a linha:
[1] - Tudo começa bem… o cliente manda um SYN para o servidor na porta 5432, conforme informado;
[2] - SYN/ACK… ok
[3] - ACK… otimo…
[4] - Parece que começou a transmissão… mas na verdade ESTÃO NEGOCIANDO A PORTA DE DADOS!
[5], [6] e [7] - Negociação da porta de dados.
[8] - 5038? É amigo, o nttcp RESOLVEU que queria usar a porta 5038 para a transmissão efetiva de dados, ou seja, acaba de estragar nosso teste, pois eu precisava dos dados sendo transmitidos na porta 5432 para simular com fidelidade minha aplicação.
Fiquei curioso para saber se isso é realmente verdade, e depois de vários outros testes, sempre com o mesmo resultado, resolvi abrir o fonte do programa. Olha só o que achei por lá:

...
#if !defined(TTCP_SERVICE)
#define	TTCP_SERVICE	5037
#endif /*TTCP_SERVICE*/
...
...
DataPort= TTCP_SERVICE+1;
...

Isso significa que não importa qual será a porta da conexão, a porta de dados sempre sera outra. Poderiamos mudar no fonte a porta de dados pra ser a porta que queremos e recompilar o programa, mas isso alteraria a forma do software funcionar.. seria preciso mudar todo o esquema de abertura dos sockets… teria que, basicamente, mudar o sistema. Sempre acho que fazer um novo é melhor que ajeitar um antigo.
Sendo assim, vamos testar outras ferramentas…
Não percam o próximo Teste na Rede. Falaremos sobre o iperf.

:wq

Teste na Rede

November 2nd, 2007

Alguém já te ligou dizendo: “O sistema está lento!!” ??

Pois é.. é normal que em qualquer caso de lentidão em um sistema cliente/servidor o problema seja associado a algum gargalo na rede. Mas os usuários esquecem que existem outros pontos de falha, como sobrecarga no servidor, problemas no cliente…

Na tentativa de agilizar os testes referentes a rede achar rapidamente o problema ou isentar a rede, fui em busca de alguma ferramenta que pudesse me ajudar.

Para especificar os requisitos dos testes, vamos montar um cenário hipotético. Nesse cenário tenho dois prédios distantes geograficamente, interligados por um link de operadora. No prédio A tenho um servidor de banco de dados PostgreSQL, rodando na porta padrão 5432. No prédio B está o cliente que acessa esse banco e reclama de lentidão. Veja imagem abaixo:

ExRede

No prédio A, antes de chegar no servidor, o tráfego passa por um QoS que dá prioridade para os pacotes que vão para a porta 5432 (Mais um motivo para desconfiar dessa reclamação de lentidão). Dessa forma, fazer um teste de rede com uma ferramenta tipo PING por exemplo, pode não te dar um resultado fiel, pois o ping não teria a mesma prioridade na máquina que faz o QoS.

A maneira ideal de fazer esse teste seria, a partir do cliente, acessar o servidor na porta 5432 e transferir uma determinada quantidade de dados, verificando sempre a taxa de transferência e a quantidade de perda de pacotes. Porém, um banco de dados não está preparado para simplesmente transferir dados aleatórios. Você precisaria elaborar um “select” que retornasse muitos dados e teria que arranjar alguma forma de mensurar a que taxa eles estão chegando. Muito complicado neh… Uma outra forma seria parar o banco de dados (!!!), colocar um outro software para rodar na porta 5432 e esse software teria que estar preparado para transferir dados. Mas parar um banco de dados não me parece boa ideia. Se estão reclamando de lentidão, imagine com o banco de dados parado.

Dessa forma, me resta usar uma outra máquina, na mesma rede do server postgres, e nela simular a porta em questão. Assim, eu estaria testando a partir do cliente até uma máquina vizinha do server principal. Para isso, utilizartemos o Server B.

E o software para transferir os dados? Bom, vamos testar a primeira solução:

Instalar Apache no Server B;
Configurar o Apache para rodar na porta 5432;
Criar um arquivo grande (pode ser com o “dd”);

# dd if=/dev/zero of=100mb.rar bs=1024 count=100000

No cliente, acessar o Server B via browser, baixando o arquivo.

Com isso, durante o download poderemos observar a taxa e verificar se realmente existe lentidão na rede:

Transferencia

Achou essa solução pouco profissional??? Eu também! Então vamos procurar algumas ferramentas para melhorar isso!

Nó próximo post falarei sobre o nttcp.

:wq

The Killer

October 2nd, 2007

O kill é um comando que manda um sinal a um processo. Normalmente ele é usado para encerrar um processo. Para isso, execute:

# kill -<sinal> <pid>

Onde, <sinal> pode ser 0 (fim normal do programa), 1 (HUP), 2 (interrupção via teclado), 3 (interrupção via teclado), 9 (pior que o RESET do computador)… dentre outros (man kill).
O kill -9 deixa processos filhos sem seus respectivos pais, fazendo com que seu computador sofra de depressão e desinteresse pelos prazeres da vida. Existem vários outros motivos para não usar o kill -9, como liberação de sockets e blá blá blá.
Uma variação do kill é o killall, que mata processos pelo nome, como no exemplo:

# killall named

O comando acima mata todos os processos de nome named. Uma opção para quem quer mandar um kill -<sinal> para um processo sem ter que dar um ps antes pra descobrir o pid é usar o comando pidof, que retorna o pid de um detrminado processo indicado pelo nome. Veja exemplo abaixo:

# kill -0 $(pidof named)

Depois dessa carnificina de processos, estou exausto e faminto. Espero ter diso útil.

Noite de Nerd

October 2nd, 2007

Ok, está decidido, vamos fazer a mudança da VPN para a Unidade Nascimento a noite. Vem Kalil e Beraldo. Tiago também vem, mas para fazer mudaças nos equipamentos wireless. Tudo começa aparentemente bem.

São 22h e Beraldo me liga: Posso fazer? Positivo e operante, respondo eu. Logo em seguida, após acabar o primeiro tempo de Vasco e Inter (só pra constar, sou são paulino), ligo para saber a quantas anda. Pelo andar da carruagem, resolvo aparecer pra dar uma forcinha… route add -net… iptables -t mangle… openssl req -nodes -new -x509 -keyout… liga pro PittsBurg e pergunta se eles fazem roteamento por protocolo, ops, não, esquece, pergunta se eles tem sanduiche de red bull que já tá todo mundo caindo de sono. Chega sanduba, roda mtr, ping, reset no firewall da outra ponta (que fica preso no setup e não volta - vai lah Kalil que o filho eh teu) traceroute, desabilita o rp_filter, ai ai ai não habilitamos o roteamento, reseta o IBM!! [É ouvido um silêncio… momentos de tensão!] Deu certo - o reset - mas ainda não funcionou… Já sei, revisar rota por rota, salto por salto, regra por regra…

Bom, acho que eh isso! 4h da manhã e tudo resolvido. Simples assim.

Ah, chegando em casa percebo que tem mais gente com sono… Desculpa Jana, ossos do orifício.

Black Holes

October 2nd, 2007

Black Holes

Essa mapa mostra o absurdo do controle que os governos tentam impor as suas nações. Nesses países a frase “A ignorância é o ópio do povo” é levada a sério. Em Cuba, por exemplo, menos de 2% da população tem acesso a internet. As conexões em casa foram quase que banidas. Para acessarem a internet, os cubanos precisam ir a Internet-Cafés, Universidades e os “Youth Computer Clubs”. Dessa forma o governo pode monitorar mais fácilmente a atividade dos usuários. Além disso, os computadores de todos os Internet-Cafés e principais hotéis possuem softwares, instalados pela polícia Cubana, que disparam mensagens de alerta sempre que uma palava-chave “subversiva” é usada.

Escrevo esse post não apenas para mostrar minha indignação com tamanho ditatorialismo, mas para que possamos valorizar a liberdade que conquistamos e para que passemos a frente a mensagem de que a liberdade deve ser resguardada, pois a ausência de servidão determina a independência da humanidade, que tem o direito a ter suas “experiências de liberdade” (a percepção que temos que uma ação foi tomada originalmente por nossa vontade). Não podemos admitir que, ainda hoje, existam pessoas impedidas de exercer o livre-arbítrio e de vivenciarem suas próprias experiências de liberdade.

Fonte da imagem e das informações sobre Cuba: http://www.rsf.org
Veja mais em: http://www.rsf.org/rubrique.php3?id_rubrique=273